在我的 Python 程序中使用 libvirt 时,我想设置一个较短的连接超时(仅几秒),而不是较长的默认超时。
我在 C libvirt API 中找到了 C 函数:
virEventAddTimeoutFunc()
:和
eventInvokeTimeoutCallback(timer, callback, opaque)
在#150号线周围的libvirt.py
中,但我不知道如何使用它。我在网上没有找到任何例子。
我尝试了这个,但出现了分段错误: :-(
import libvirt
def timeout_cb_d():
print 'Timeout !'
try:
# try to set the libvirt timeout to 2 seconds:
t = libvirt.eventInvokeTimeoutCallback(2, timeout_cb_d, "from dom0_class")
except:
...
有人可以给我一个可行的例子吗?
我们终于找到了一种简单的方法来继续使用Python警报和信号处理程序:http://docs.python.org/library/signal.html#example
编辑:
这个想法是这样的:
import libvirt, signal
class Host:
# (...)
def timeout_handler(self, sig_code, frame):
if 14 == sig_code: sig_code = 'SIGALRM'
print 'Signal handler called with signal:', sig_code
raise Exception('Timeout!')
def libVirtConnect(self):
try:
# Enable the timeout with an alarm:
signal.signal(signal.SIGALRM, self.timeout_handler)
signal.alarm(self._libvirt_timeout_in_seconds)
self._virt_conn = libvirt.open('xen+tcp://'+self._ip)
signal.alarm(0) # Disable the alarm
except Exception, e:
print e
signal.alarm(0) # Disable the alarm
我假设 libvirt 通过标准套接字进行通信。如果是这种情况,您可以使用
socket.settimeout
设置应用程序范围的超时。
这并不是说 python 的 libvirt 绑定本身不调用该函数,但值得一试。
我经常使用monkeypatching来更改库,以使套接字超时。通常你只需要找到调用
select
或 poll
的方法以及修改版本中的 Monkeypatch 即可。有时您需要设置一个 try-catch 来捕获 socket.timeout 并执行一些操作以允许它渗透到您的代码中,而不会导致另一个错误。例如,在一种情况下,我必须创建一个有效的响应对象而不是 None。