2013-03-28 3 views
1

У меня есть сервер, который делает «некоторые вещи» в разделе, и у меня есть «с gevent.Timeout (5)» вокруг этого. У меня есть некоторые проверки, происходящие в другой зеленее, и через это я заметил, что одна из зелий, которая делала это «кое-что», работала на 45 минут. Мне пришлось в конце концов перезапустить программу, чтобы убить ее (я знаю о других способах ее убить, но это не проблема ..).gevent.Timeout не поставлено

I обезьяна patching используя gevent.monkey.patch_all() также. Часть «некоторых вещей» связана с сетевыми подключениями, и я предполагаю, что что-то застряло в одном из этих мест. Я не понимаю, почему исключение тайм-аута не было поднято. Кто-нибудь может понять, почему исключение gevent.Timeout не могло быть поднято?

ответ

0

Когда я использовал gevent.Timeout, я также использовал его в качестве менеджера контекста, но со вторым аргументом False. Таким образом, менеджер контекста подавляет любое исключение и просто оставляет кусок кода. Вы можете следить за проверкой, если, скажем, блок устанавливается значение успешно:

result = None 
with gevent.Timeout(5, False): 
    # Something that stalls 

if result == None: 
    # Take care of business 

Это работает для меня очень надежно. Похоже, что второй аргумент по умолчанию exception - gevent.Timeout - None - Вы пытались заменить его собственным типом исключения? Или даже Exception?

+0

Я думаю, что второй аргумент как False или None не должен иметь значения? И после блока gevent.Timeout у меня было заявление о возврате, поэтому, очевидно, мой код застрял где-то в этом блоке. Я не мог использовать результат if: == None: statement. Я не могу повторить проблему локально. Это было на рабочем сервере. Я мог бы попробовать свое собственное исключение, но я должен снова решить проблему, и даже если могу, интересно, мое исключение вообще будет брошено, потому что раньше оно не было раньше. – Nitin

+0

Сказка такая же старая, как и время :-) FWIW, нам потребовалось немного времени, чтобы поработать с 'gevent.Timeout', и в конце концов с использованием' False' и проверки 'None' в результате работал на нас. Если ваша сетевая связь - это настройки для HTTP, я могу указать вам на некоторые из наших модульных тестов, которые могут помочь вам перечитать таймауты. –

+0

Это не HTTP-запрос, а соединение с базой данных, и у меня есть сильное чувство, что это связано с сокетами. Я нашел еще одну ошибку в gevent, связанную с тайм-аутами сокетов, если вы используете makefile - [link] (https://bitbucket.org/denis/gevent/commits/65968cf1baa9/). Но, конечно, было бы полезно проверить, как выглядят ваши тесты модулей, и если я могу воспроизвести проблему локально. Я не понимаю, почему использование False должно тренироваться. Я тоже должен подумать об этом. – Nitin