在tornado事件循环中使用concurrent.futures?

时间:2015-09-14 14:16:29

标签: python concurrency tornado concurrent.futures

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

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

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)

1 个答案:

答案 0 :(得分:4)

您根本不需要特殊的f功能,只需产生executor.submit返回的未来:

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

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