Twisted: создание ThreadPool, а затем демонизация приводит к неинформативным зависаниям

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

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

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

В Twisted's 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.

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


person Rob Golding    schedule 02.02.2011    source источник


Ответы (1)


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

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

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

person Glyph    schedule 02.02.2011
comment
Это потрясающе. Я не знаю, почему я не видел этого в документации, но это работает как шарм. Спасибо! - person Rob Golding; 02.02.2011