Форум сайта python.su
Всем привет.
Имеется приложение на питоне, использующее 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, а запускать поток стандартными питоновскими методами (непотокобезопасно по отношению к твистеду). Та же самая ситуация.
В логах ничего нет, просто идет выполнение, а потом обрывается. Умирать может несколько раз за день, или два раза в неделю.
Куда можно покопать?
Офлайн
Какая ОСь? Какой Python (попробуй 2.5 или др. версию)? Используются причудливые библиотеки, вроде GLib/GObject? Может Psyco? Какой нативный код может выполняться в потоке (т.е. не чисто питоновские пакеты)?
Пологаю, что это не даст никаких результатов, но – .addErrback(log.err)
Попробуй симофорить (логи писать) в потоке, что бы определить какой участок кода там сбоит. Врядли это проблема Twisted.
..bw
Офлайн
bwОсь - Ubuntu 9.04.
Какая ОСь? Какой Python (попробуй 2.5 или др. версию)? Используются причудливые библиотеки, вроде GLib/GObject? Может Psyco? Какой нативный код может выполняться в потоке (т.е. не чисто питоновские пакеты)?
Пологаю, что это не даст никаких результатов, но – .addErrback(log.err)
Попробуй симофорить (логи писать) в потоке, что бы определить какой участок кода там сбоит. Врядли это проблема Twisted.
..bw
Офлайн
Логирование показало, что действительно, твистед тут нипричем.
Похоже поток даже не умирает, а зависает, на urllib2.urlopen().
Если во второй раз в похожем месте умрет, значит там что-то не так.
Офлайн
Не кошерно использовать urllib2 с Twisted :-).
Можно попробовать поставить меньший таймаут на блокируемые сокеты, например так – socket.setdefaulttimeout(5.0). Может это к чему-нибудь приведет.
..bw
Офлайн
bwНе кошерно. Но python-twitter именно его использует, а свою обертку делать лень.
Не кошерно использовать urllib2 с Twisted :-).
Можно попробовать поставить меньший таймаут на блокируемые сокеты, например так – socket.setdefaulttimeout(5.0). Может это к чему-нибудь приведет.
..bw
Офлайн
Почувствуй силу Monkey Patching, юный падаван :-).
Можно сделать хук для urllib2.urlopen или другого метода (соответствующего направления) и обрабатывать его через Twisted. Полагаю, что это не сложно, наверное, я бы рискнул пойти на такой эксперимент, правда от потоков, таким образом, избавиться бы не получилось :-(.
..bw
Офлайн