【问题标题】:Await Future from Executor: Future can't be used in 'await' expressionAwait Future 来自 Executor:Future 不能在“await”表达式中使用
【发布时间】:2016-03-26 09:55:59
【问题描述】:

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

Future 不是对象等待吗?为什么说不是?

我怎样才能await Futureexecutor.submit 返回的对象?

Python 3.5.0

编辑

使用executor.submit 不是我的决定。这由多个库内部使用,例如requests-futures。我正在寻找一种方法来与协程中的这些模块进行互操作。

【问题讨论】:

    标签: python python-3.x async-await future python-asyncio


    【解决方案1】:

    你应该使用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.Futureasyncio.Future 旨在与事件循环一起使用并且是可等待的,而前者不是。 loop.run_in_executor 提供了两者之间必要的互操作性。

    编辑#2

    使用 executor.submit 不是我的决定。这由多个库内部使用,例如 requests-futures。我正在寻找一种方法来与协程中的这些模块进行互操作。

    编辑#3

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

    【讨论】:

    • 我不知道为什么投反对票。这当然有效。然而,我对why 而不是how 更感兴趣。另外,我使用 futures-requests 库,它在内部使用提交。
    • 简单的为什么concurrent.futures.Future是不可等待的。你在想asyncio.Future
    • 好的,所以我们有不同的类型,称为 Future。这些类型之间有转换吗?
    • asyncio.wrap_future 可能是您正在寻找的。虽然我不确定它是 public 还是在文档中的任何位置列出。
    • asyncio.wrap future is documented there (但文档没有说什么@JashandeepSohi 没有说。)
    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2018-02-22
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多