2011-04-08 30 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,並做一些事情來讓它滲透到你的代碼中,而不會導致另一個錯誤。例如,我必須創建一個有效的響應對象,而不是無。

相關問題