#python #timeout #virtualization #libvirt
#python #тайм-аут #виртуализация #libvirt
Вопрос:
Я хотел бы установить короткий тайм-аут соединения (всего несколько секунд) при использовании libvirt в моей программе Python вместо длительного тайм-аута по умолчанию.
Я нашел функцию C: virEventAddTimeoutFunc()
в C libvirt API здесь:
http://libvirt.org/html/libvirt-libvirt.html#virEventAddTimeoutFunc
и eventInvokeTimeoutCallback(timer, callback, opaque)
в libvirt.py
строке # 150, но я не знаю, как это использовать. Я не нашел ни одного примера в сети.
Я пробовал это, но я получаю ошибку сегментации:
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:
...
Кто-нибудь может привести мне рабочий пример, пожалуйста?
Ответ №1:
Мы, наконец, нашли простой способ продолжить, используя Python alarm amp; обработчик сигналов: 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
Комментарии:
1. Ответы, которые содержат только ссылки, считаются плохой практикой . Пожалуйста, обобщите содержимое здесь (не копируйте / вставляйте), чтобы ответ мог быть самостоятельным. Если вы этого не сделаете, вы рискуете удалить свой ответ, особенно если ссылка когда-либо умрет.
2. Привет, Мартин Питерс, я только что добавил немного кода на Python для завершения моего ответа.
Ответ №2:
Я предполагаю, что libvirt обменивается данными через стандартный сокет. В этом случае вы можете установить тайм-аут для всего приложения с помощью socket.settimeout
.
Это не значит, что привязки libvirt для python сами не вызывают эту функцию, но попробовать стоит.
Ответ №3:
Я часто использовал monkeypatching для изменения библиотеки таким образом, чтобы сокеты имели тайм-аут. Обычно вам просто нужно найти метод, который вызывает select
or poll
и monkeypatch в модифицированной версии. Иногда вам нужно настроить try-catch, который перехватывает socket.timeout и делает что-то, чтобы позволить ему просочиться в ваш код, не вызывая при этом другой ошибки. Например, в одном случае мне пришлось создать допустимый объект response вместо None.