【发布时间】:2017-03-30 09:58:55
【问题描述】:
TL;DR: Twisted 中是否有办法使用自定义初始化程序来影响线程创建或替换反应器使用的 ThreadPool 实现?或者,一个任务能否可靠地排队到反应器线程池中的所有线程?
详情:
我在 Twisted 应用程序中运行 Flask 应用程序,使用 this pattern:
resource = WSGIResource(reactor, reactor.getThreadPool(), the_app)
site = server.Site(resource)
reactor.listenTCP(port, site, interface=bind_ip)
对于 XML 解析,我使用 lxml,它偶尔会在其内部错误日志中生成一个条目,这实际上会泄漏内存。在我看来,有两种方法可以解决这个问题:定期使用etree.clear_error_log() 清除错误日志或使用etree.useGlobalPythonLog() 设置全局日志。
不幸的是,每个方法都需要在每个线程上运行,至少一次。因此,我需要让 ThreadPool 中的每个线程运行一次代码(在初始化期间)或定期运行(概念上类似于“reactor.callFromEveryThread()”)。
【问题讨论】:
-
我找到了一种对反应堆进行猴子补丁以使用自定义线程池的方法,但这可以说是一种非常丑陋的方法。