signal.SIGALRM с uwsgi

Я запускаю django с сервером uwsgi. Мой код содержит много вызовов API с urllib2, например:

with closing(urllib2.urlopen(request, timeout=1)) as f:
    content = f.read()

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

И я хочу ограничить этот блок кода. Пытался добиться этого с помощью signal.SIGALRM, но это не работает с uwsgi (я запускаю без enable-threads). Но это работает с Apache+mod_wsgi. Тайм-аут потока выглядит ненадежным.

Никаких ошибок, SIGALRM просто игнорируется либо в режиме харакири, либо нет. Я плохо читаю исходный код C, но причина такого поведения здесь.


person San4ez    schedule 26.03.2013    source источник
comment
У меня был очень похожий вопрос: stackoverflow.com/questions/28536469/   -  person jb.    schedule 18.02.2015


Ответы (2)


Python, скомпилированный с поддержкой потоков, не вызывает пользовательские обработчики сигналов в своих threads или fork()s, если он не будет повторно инициализирован с помощью PyOS_AfterFork() , что обычно происходит в os.fork(), но, как ни странно, uwsgi не делает этого по умолчанию. Однако он предоставляет опцию --py-call-osafterfork. , с помощью которых подчиненные устройства uwsgi могут обрабатывать сигналы, включая SIGALRM.

person Orivej Desh    schedule 17.11.2015

не используйте сигналы UNIX для таких вещей, они в основном ненадежны. Режим харакири имеет аналог уровня пользователя:

uwsgi.set_user_harakiri(10)
with closing(urllib2.urlopen(request, timeout=1)) as f:
    content = f.read()
uwsgi.set_user_harakiri(0)
person roberto    schedule 26.03.2013
comment
Как я могу поймать исключение харакири? - person San4ez; 26.03.2013
comment
вы не можете, так как рабочий будет перезагружен, если функция заблокирована более чем на 10 секунд (или любое другое значение, которое вы установили) - person roberto; 26.03.2013
comment
На самом деле это не то, что я ищу =( - person San4ez; 26.03.2013
comment
тогда используйте не urllib, а что-то вроде curl, что позволяет вам лучше контролировать тайм-ауты. Теперь я понимаю, что вы хотели использовать ALARM для внедрения исключения в виртуальную машину Python: это очень плохо и подвержено всевозможным ошибкам :) - person roberto; 26.03.2013