2011-04-08 15 views
1


我想在我的Python程序中使用libvirt而不是长时间默认的时候设置一个短连接超时(只有几秒钟)。这里的C libvirt的API在virEventAddTimeoutFunc()如何在libvirt中设置超时(使用Python)

我发现C函数
http://libvirt.org/html/libvirt-libvirt.html#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: 
    ... 

有谁可以给​​我一个工作示例请

回答

0

我们终于找到了一个简单的方法使用Python报警&信号处理程序进行: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 
+0

只包含链接的答案是[认为不好的做法](http://meta.stackexchange.com/q/8231)。请总结这里的内容(不要复制/粘贴),这样答案就可以独立运作。如果你不这样做,那么你的答案就会被删除,特别是如果链接死亡的话。 – 2012-11-09 18:57:39

+0

嗨Martijn彼得斯,我只是添加了一些Python代码来完成我的答案。 – PixEye 2012-12-06 09:52:38

0

我假设的libvirt通过一个标准的插座进行通信? 。如果是这样的话,你可以使用socket.settimeout来设置应用程序范围的超时。

这并不是说python的libvirt绑定本身不会调用这个函数,但它值得一个tr年。

0

我经常使用的Monkeypatching改变库,以便套接字超时。通常你只需要找到调用selectpoll的方法和修改版本中的monkeypatch。有时你需要设置一个捕获socket.timeout的try-catch,并做一些事情来让它渗透到你的代码中,而不会导致另一个错误。例如,我必须创建一个有效的响应对象,而不是无。

相关问题