Twisted: 创建线程池后守护化导致无信息挂起

5 投票
1 回答
1729 浏览
提问于 2025-04-16 11:05

我正在开发一个网络应用,使用的是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 中令人困惑的问题的方法,我期待看到你的修复补丁 :).

撰写回答