我想在我的Python程序中使用libvirt而不是长默认程序时设置短连接超时(仅几秒)。
我在C libvirt API中找到了C函数:virEventAddTimeoutFunc()
:
http://libvirt.org/html/libvirt-libvirt.html#virEventAddTimeoutFunc
eventInvokeTimeoutCallback(timer, callback, opaque)
中的和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:
...
有人能给我一个有效的例子吗?
答案 0 :(得分:0)
我假设libvirt通过标准套接字进行通信。如果是这种情况,您可以使用socket.settimeout
设置应用程序范围的超时。
这并不是说python的libvirt绑定本身不会调用该函数,但值得一试。
答案 1 :(得分:0)
我们终于找到了一种简单的方法来继续使用Python alarm&信号处理程序:http://docs.python.org/library/signal.html#example
编辑:
这是一个想法:
import string, time, sys, signal
class Host:
# (...)
def timeout_handler(self, sig_code, frame):
if 14 == sig_code: sig_code = 'SIGALRM'
print time.strftime('%F %T -'), '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:
signal.alarm(0) # Disable the alarm
答案 2 :(得分:0)
我经常使用monkeypatching来更改库,以便套接字超时。通常,您只需要在修改后的版本中找到调用select
或poll
和monkeypatch的方法。有时你需要设置一个try-catch来捕获socket.timeout并做一些事情以允许它渗透到你的代码而不会在路上造成另一个错误。例如,在一种情况下,我必须创建一个有效的响应对象而不是None。