我想使用一个ThreadPoolExecutor从一个python coroutine委托一些阻塞的网络调用到一个单独的线程。但是,运行以下代码:
from concurrent.futures import ThreadPoolExecutor
import asyncio
def work():
# do some blocking io
pass
async def main():
executor = ThreadPoolExecutor()
await executor.submit(work)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
导致错误:
TypeError: object Future can't be used in 'await' expression
对象是否可以等待?为什么说他们没有?
我如何才能由
Future
返回await
对象?python 3.5.0版
编辑
使用
Future
不是我的决定。这在内部由多个库使用,如executor.submit
。我正在寻找一种从协程中与这些模块进行互操作的方法。 最佳答案
您应该使用:
from concurrent.futures import ThreadPoolExecutor
import asyncio
def work():
# do some blocking io
pass
async def main(loop):
executor = ThreadPoolExecutor()
await loop.run_in_executor(executor, work)
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
编辑
loop.run_in_executor
对象与concurrent.futures.Future
不同。asyncio.Future
用于事件循环,可以等待,而前者不用于事件循环。asyncio.Future
提供了两者之间必要的互操作性。编辑2
使用executor.submit不是我的决定。这在多个库内部使用,如请求预购。我正在寻找一种从协程中与这些模块进行互操作的方法。
编辑3
由于python 3.5(
loop.run_in_executor
),您可以使用asyncio.wrap_future(future, *, loop=None)
将aconcurrent.futures.Future
转换为aasyncio.Future
。关于python - 从Executor等待Future:Future不能用于'await'表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34376814/