В Python, как я могу установить тайм-аут для вызова функции, который иногда зависает? - PullRequest
1 голос
/ 28 декабря 2011

Я использую паука Python для сканирования интернета, используя urllib2 OpenerDirector.Проблема в том, что соединение неизбежно будет висеть на адресе https, очевидно, игнорируя значение тайм-аута.

Одним из решений было бы запустить его в потоке, а затем уничтожить и перезапустить поток, если он завис.Очевидно, Python не поддерживает уничтожение потоков и считается плохой идеей из-за сборки мусора и других проблем.Однако это решение было бы предпочтительнее для меня из-за простоты.

Другая идея состояла бы в использовании асинхронной библиотеки, такой как Twisted, но это не решает проблему.

Мне либо нужнаспособ принудительно прервать вызов или исправить способ, которым urllib2 OpenerDirector обрабатывает тайм-ауты.Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Другой вопрос StackOverflow похож на здесь .Когда я столкнулся с чем-то похожим, мне было проще преобразовать то, что я делал, в определение и вызов функций, которые впоследствии могут возвращать значение по событию тайм-аута.Это может на самом деле открыть больше возможностей, используя различные возвращаемые значения.

Другой ответ на связанный с этим вопрос, который я связал с вышеупомянутым, звучит больше как то, что вы ищете (насколько я понимаю): https://stackoverflow.com/a/5817436/1118357

0 голосов
/ 02 января 2012

Я предлагаю использовать другой процесс вместо потоков. как это:

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 секунд.

...