扭曲反应堆的getThreadPool(或替代ThreadPool实现)的每线程初始化器

时间:2017-03-30 09:58:55

标签: flask lxml twisted

TL; DR:是否有一种方法可以使用自定义初始化程序来影响线程创建或替换反应堆使用的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()”)。

1 个答案:

答案 0 :(得分:1)

没有良好的公共界面来完成此任务。您应该在Twisted问题跟踪器中提交功能请求。已经有一些努力来开发新的线程池接口。它在任何Twisted版本中都没有公开发布(也不在trunk @HEAD中)。现在是在最初引入公共界面之前获得新要求的好时机。