我想用的ThreadPoolExecutor从蟒蛇协程,委托一些阻塞网络调用到一个单独的线程.但是,运行以下代码:
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
一个Future
对象executor.submit
?
Python 3.5.0
编辑
使用executor.submit
不是我的决定.这在几个库内部使用,比如requests-futures
.我正在寻找一种方法来与协同程序中的那些模块互操作.
你应该使用loop.run_in_executor
:
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()
编辑
concurrent.futures.Future
对象不同于asyncio.Future
.在asyncio.Future
旨在与事件循环使用,并且awaitable,而前者则不是.loop.run_in_executor
提供两者之间必要的互操作性.
编辑#2
使用executor.submit不是我的决定.这在几个库内部使用,例如请求期货.我正在寻找一种方法来与协同程序中的那些模块互操作.
编辑#3
从python 3.5(docs)开始,您可以使用asyncio.wrap_future(future, *, loop=None)
将a转换concurrent.futures.Future
为a asyncio.Future
.