Twisted: создание ThreadPool, а затем демонизация приводит к неинформативным зависаниям - PullRequest
5 голосов
/ 02 февраля 2011

Я занимаюсь разработкой сетевого приложения для Twisted, часть которого состоит из веб-интерфейса, написанного на Django.

Я хочу использовать WSGI-сервер Twisted для размещения веб-интерфейса, и я написал рабочийплагин «tap», позволяющий мне использовать twistd.

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

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

К сожалению, проблема не была устранена и была поднята почти год назад.

Я попытался создать класс ThreadPoolService, который расширяет Service и запускает заданный ThreadPool при вызове startService:

class ThreadPoolService(service.Service):
    def __init__(self, pool):
        self.pool = pool

    def startService(self):
        super(ThreadPoolService, self).startService()
        self.pool.start()

    def stopService(self):
        super(ThreadPoolService, self).stopService()
        self.pool.stop()

Однако Twisted, похоже, не вызываетstartService метод вообще.Я думаю, проблема в том, что с плагином «tap» ServiceMaker может вернуть только одну службу, которую нужно запустить - и все остальные, принадлежащие к тому же приложению, не запускаются.Очевидно, я возвращаю сервис TCPServer, который содержит корень WSGI.

На этом этапе я наткнулся на что-то вроде кирпичной стены.У кого-нибудь есть идеи, как мне обойти эту проблему?

1 Ответ

7 голосов
/ 02 февраля 2011

Возврат MultiService из вашего ServiceMaker; тот, который включает в себя ваш ThreadPoolService, а также ваш основной сервис приложений. API для сборки такой вещи довольно прост:

multi = MultiService()
mine = TCPServer(...) # your existing application service
threads = ThreadPoolService()
mine.setServiceParent(multi)
threads.setServiceParent(multi)
return multi

Учитывая, что вы уже нашли билет для решения этой запутанной проблемы в Twisted, я с нетерпением жду вашего патча:).

...