【问题标题】:Per-thread initializers for twisted reactor's getThreadPool (or alternative ThreadPool implementation)扭曲反应器的 getThreadPool(或替代 ThreadPool 实现)的每线程初始化程序
【发布时间】: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()”)。

【问题讨论】:

  • 我找到了一种对反应堆进行猴子补丁以使用自定义线程池的方法,但这可以说是一种非常丑陋的方法。

标签: flask lxml twisted


【解决方案1】:

没有好的公共接口来完成这个。您应该在 Twisted 问题跟踪器中提交功能请求。已经努力开发一个新的线程池接口。它尚未在 Twisted 的任何版本中公开提供(也未在 trunk@HEAD 中)。在最初引入公共接口之前,现在是让新需求得到认可的好时机。

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-27
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多