Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 22, 2009 10:15:43

Максим
От:
Зарегистрирован: 2009-09-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Twistd - умирает поток.

Всем привет.

Имеется приложение на питоне, использующее twisted (Jabber бот). Запускается как twistd -oy tac/application.tac

В application.tac определяется функция ticker(), которая возвращает deferred объект путем вызова deferToThread(non_safe_ticker). С помощью twisted.internet.task.LoopingCall, ticker() запускается каждые 30 секунд.

Проблема в том, что поток выполняющий функцию non_safe_ticker иногда умирает. Без слов. Внутри него происходит обращение к БД, обращение к сети, и дергается сигнал send_message, на который подвешен бот написанный на твистеде. Он при этом шлет сообщение пользователю по протоколу XMPP. При смерти потока deferred объект естественно никогда не возвращает состояние, и LoopingCall останавливается навсегда.
Пробовал убирать LoopingCall просто в non_safe_ticker сам реализовывал интервальный вызов. Поток все равно иногда умирает.
Пробовал делать без deferToThread, а запускать поток стандартными питоновскими методами (непотокобезопасно по отношению к твистеду). Та же самая ситуация.
В логах ничего нет, просто идет выполнение, а потом обрывается. Умирать может несколько раз за день, или два раза в неделю.
Куда можно покопать?



Офлайн

#2 Сен. 22, 2009 12:56:26

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Twistd - умирает поток.

Какая ОСь? Какой Python (попробуй 2.5 или др. версию)? Используются причудливые библиотеки, вроде GLib/GObject? Может Psyco? Какой нативный код может выполняться в потоке (т.е. не чисто питоновские пакеты)?

Пологаю, что это не даст никаких результатов, но – .addErrback(log.err)
Попробуй симофорить (логи писать) в потоке, что бы определить какой участок кода там сбоит. Врядли это проблема Twisted.

..bw



Офлайн

#3 Сен. 22, 2009 13:11:31

Максим
От:
Зарегистрирован: 2009-09-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Twistd - умирает поток.

bw
Какая ОСь? Какой Python (попробуй 2.5 или др. версию)? Используются причудливые библиотеки, вроде GLib/GObject? Может Psyco? Какой нативный код может выполняться в потоке (т.е. не чисто питоновские пакеты)?

Пологаю, что это не даст никаких результатов, но – .addErrback(log.err)
Попробуй симофорить (логи писать) в потоке, что бы определить какой участок кода там сбоит. Врядли это проблема Twisted.

..bw
Ось - Ubuntu 9.04.
Python 2.5
Glib/Gobject/Psyco не используются.
.addErrback не помогает, т.к. эксцепшены все ловятся внутри. Стоит except на все эксцепшены внутри потока, который пишет алерты в лог.

Про писать логи спасибо, попробую в ключевых моментах поставить. Только проект в работе, когда упадет неизвестно, логи будут огромные.

Про твистед наталкивает мысль, что там ничего другого не используется. Т.е. запрос по сети, запрос к базе (потокобезопасные части в теории), и отправка сообщения пользователю (дергается сигнал, по сигналу бот шлет сообщение пользователю по сети, выполняется вне потока реактора).



Офлайн

#4 Сен. 24, 2009 06:20:35

Максим
От:
Зарегистрирован: 2009-09-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Twistd - умирает поток.

Логирование показало, что действительно, твистед тут нипричем.
Похоже поток даже не умирает, а зависает, на urllib2.urlopen().
Если во второй раз в похожем месте умрет, значит там что-то не так.



Офлайн

#5 Сен. 24, 2009 11:47:19

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Twistd - умирает поток.

Не кошерно использовать urllib2 с Twisted :-).
Можно попробовать поставить меньший таймаут на блокируемые сокеты, например так – socket.setdefaulttimeout(5.0). Может это к чему-нибудь приведет.

..bw



Офлайн

#6 Сен. 24, 2009 11:51:56

Максим
От:
Зарегистрирован: 2009-09-22
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Twistd - умирает поток.

bw
Не кошерно использовать urllib2 с Twisted :-).
Можно попробовать поставить меньший таймаут на блокируемые сокеты, например так – socket.setdefaulttimeout(5.0). Может это к чему-нибудь приведет.

..bw
Не кошерно. Но python-twitter именно его использует, а свою обертку делать лень.
Таймаут поставил, спасибо. Логирование еще детальнее сделал, буду наблюдать.



Офлайн

#7 Сен. 24, 2009 13:03:04

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Twistd - умирает поток.

Почувствуй силу Monkey Patching, юный падаван :-).
Можно сделать хук для urllib2.urlopen или другого метода (соответствующего направления) и обрабатывать его через Twisted. Полагаю, что это не сложно, наверное, я бы рискнул пойти на такой эксперимент, правда от потоков, таким образом, избавиться бы не получилось :-(.

..bw



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version