1


Python プログラムで libvirt を使用する場合、デフォルトの長い接続タイムアウトではなく、短い接続タイムアウト (数秒のみ) を設定したいと考えています。

私はC関数を見つけましたvirEventAddTimeoutFunc():ここのC libvirt APIで:
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:
    ...

誰かが私に実際の例を教えてください。

4

3 に答える 3

1

最終的に、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
于 2011-10-11T13:32:25.167 に答える
0

私はよくmonkeypatchingを使ってライブラリを変更し、ソケットがタイムアウトするようにしました。select通常、変更されたバージョンでorpollおよび monkeypatchを呼び出すメソッドを見つけるだけで済みます。場合によっては、socket.timeout をキャッチする try-catch を設定して、途中で別のエラーを発生させずにコードに浸透できるようにする必要があります。たとえば、あるケースでは、None ではなく有効な応答オブジェクトを作成する必要がありました。

于 2011-10-12T05:59:17.073 に答える