如何在libvirt中设置超时(使用Python)

问题描述 投票:0回答:3


在我的 Python 程序中使用 libvirt 时,我想设置一个较短的连接超时(仅几秒),而不是较长的默认超时。

我在 C libvirt API 中找到了 C 函数:

virEventAddTimeoutFunc()

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:
    ...

有人可以给我一个可行的例子吗?

python timeout virtualization libvirt
3个回答
1
投票

我们终于找到了一种简单的方法来继续使用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

0
投票

我假设 libvirt 通过标准套接字进行通信。如果是这种情况,您可以使用

socket.settimeout
设置应用程序范围的超时。

这并不是说 python 的 libvirt 绑定本身不调用该函数,但值得一试。


0
投票

我经常使用monkeypatching来更改库,以使套接字超时。通常你只需要找到调用

select
poll
的方法以及修改版本中的 Monkeypatch 即可。有时您需要设置一个 try-catch 来捕获 socket.timeout 并执行一些操作以允许它渗透到您的代码中,而不会导致另一个错误。例如,在一种情况下,我必须创建一个有效的响应对象而不是 None。

© www.soinside.com 2019 - 2024. All rights reserved.