从执行者等待未来:未来不能用于“等待”表达式

2024-06-17 10:54:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用python coroutine中的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

对象不是可以等待的吗?为什么上面说他们不是?

我怎样才能await返回的Future对象?

Python3.5.0

编辑

使用executor.submit不是我的决定。这在内部被几个库使用,比如^{}。我正在寻找一种与协同程序中的模块进行互操作的方法。


Tags: 对象import网络loopasynciomaindeffuture
1条回答
网友
1楼 · 发布于 2024-06-17 10:54:47

您应该使用^{}

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()

编辑

^{}对象不同于^{}asyncio.Future旨在与事件循环一起使用,并且是可等待的,而前者不是。

编辑2

Using executor.submit is not my decision. This is used internally by several libraries, like requests-futures. I am searching for a way to interop with those modules from coroutines.

编辑3

由于python 3.5(docs),您可以使用asyncio.wrap_future(future, *, loop=None)concurrent.futures.Future转换为asyncio.Future

相关问题 更多 >