В Python, как я могу установить таймаут для вызова функции, который иногда зависает?
Я использую паука Python для сканирования интернета с помощью urllib2 OpenerDirector. Проблема заключается в том, что соединение неизбежно будет зависать по адресу https, очевидно, игнорируя значение тайм-аута.
Одним из решений было бы запустить его в потоке, а затем уничтожить и перезапустить поток, если он зависает. Очевидно, Python не поддерживает уничтожение потоков и считается плохой идеей из-за сборки мусора и других проблем. Это решение было бы предпочтительнее для меня, однако, из-за простоты.
Другая идея заключается в использовании асинхронной библиотеки, такой как Twisted, но это не решает проблему.
Мне либо нужен способ принудительно прервать вызов, либо исправить способ, которым urllib2 OpenerDirector обрабатывает тайм-ауты. Благодарю.
2 ответа
Другой вопрос Stackru аналогичен здесь. Когда я столкнулся с чем-то похожим, мне было проще преобразовать то, что я делал, в определение и вызов функций, которые впоследствии могут возвращать значение по событию тайм-аута. Это может на самом деле открыть больше возможностей, используя различные возвращаемые значения.
Другой ответ на связанный с этим вопрос, который я связал выше, больше похож на то, что вы ищете (насколько я понимаю): /questions/11023663/est-li-sposob-ubit-nit/11023700#11023700
Я предлагаю использовать другой процесс вместо потоков. как это:
from multiprocessing import Process
checker = Process(target=yourFunction, args=(some_queue))
timeout = 150
checker.start()
counter = 0
while checker.is_alive() == True:
time.sleep(1)
counter += 1
if counter > timeout :
print "Son process consumed too much run-time. Going to kill it!"
kill(checker.pid)
break
таким образом, что бы ни происходило, процесс сына убивается через 150 секунд.