Twisted: 创建线程池后守护化导致无信息挂起
我正在开发一个网络应用,使用的是Twisted框架,其中一部分是用Django写的网页界面。
我想用Twisted的WSGI服务器来托管这个网页界面,并且我写了一个可以工作的“tap”插件,这样我就可以使用twistd
命令。
当我用-n
这个参数运行服务器时(意思是不让它变成后台进程),一切都正常。但如果去掉这个参数,服务器就完全不响应请求了,而且没有任何日志信息(虽然服务器还是在运行)。
在Twisted的Trac上有一个bug,看起来正好描述了这个问题,而我的插件正好是基于这个链接中的代码。
不幸的是,这个问题到现在还没有被解决,而这个问题提出差不多快一年了。
我尝试创建一个ThreadPoolService
类,这个类继承自Service
,并在调用startService
时启动一个指定的ThreadPool
:
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
只能返回一个要启动的服务,而同一个应用中的其他服务不会被启动。显然,我返回的是一个包含WSGI根目录的TCPServer
服务。
到目前为止,我遇到了一些困难。有没有人有什么想法,能帮我解决这个问题?
1 个回答
7
从你的 ServiceMaker
返回一个 MultiService
;这个 MultiService
包含你的 ThreadPoolService
和你的主应用服务。组装这样的东西的接口(API)其实很简单:
multi = MultiService()
mine = TCPServer(...) # your existing application service
threads = ThreadPoolService()
mine.setServiceParent(multi)
threads.setServiceParent(multi)
return multi
既然你已经找到了解决这个在 Twisted 中令人困惑的问题的方法,我期待看到你的修复补丁 :).