将 concurrent.futures 与龙卷风事件循环一起使用?

MRo*_*lin 3 python concurrency tornado concurrent.futures

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

我的服务器偶尔需要在单独的线程或进程中运行长时间运行的任务(任务释放 GIL。)我想用 concurrent.futures 执行器来做到这一点

from concurrent.futures import ThreadPoolExecutor
executor = ThreadPoolExecutor(10)
future = executor.submit(func, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

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

理想情况下,我想从concurrent Future.

我正在寻找一个功能f,使以下成为可能

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

A. *_*vis 5

您根本不需要特殊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
Run Code Online (Sandbox Code Playgroud)