【问题标题】:Use concurrent.futures with tornado event loop?将 concurrent.futures 与龙卷风事件循环一起使用?
【发布时间】:2015-09-14 14:16:28
【问题描述】:

如何偶尔在 Tornado 应用程序中使用线程和期货?

我的服务器偶尔需要在单独的线程或进程中运行长时间运行的任务(该任务会释放 GIL。)我想使用 concurrent.futures 执行器来执行此操作

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(10)
future = executor.submit(func, *args, **kwargs)

如何将这个未来集成到 Tornado 事件循环中?理想情况下,这种集成与 tornado.gen 协程配合得很好。我想从未来中屈服,而不是阻碍它。实现这一目标的最佳方法是什么?

理想情况下,我想从concurrent Future 屈服。

我正在寻找一个函数f,它可以实现以下目标

@gen.coroutine
def my_coroutine(...)
    ...
    future = executor.submit(func, *args, **kwargs)
    result = yield f(future)

【问题讨论】:

  • 这只是假设工作,根据文档,龙卷风的未来与 concurrent.futures tornado.readthedocs.org/en/latest/concurrent.html 兼容
  • 我相信那里讨论的兼容性是相反的。
  • 采用另一种方式实际上没有任何意义,因为您无法将 Tornado 未来推送到现有的 concurrent.futures 池中。当你尝试 yield future 时会发生什么(没有任何 f)
  • 啊,@a-jesse-jiry-davis 下面的回复证实了您的评论

标签: python concurrency tornado concurrent.futures


【解决方案1】:

您根本不需要特殊的 f 函数,只需生成 executor.submit 返回的 Future:

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(10)

@gen.coroutine
def my_coroutine(...)
    ...
    future = executor.submit(func, *args, **kwargs)
    result = yield future

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    相关资源
    最近更新 更多