我想使用一个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/

10-12 19:32
查看更多