当前位置:  开发笔记 > 编程语言 > 正文

从Executor等待Future:Future不能用于'await'表达式

如何解决《从Executor等待Future:Future不能用于'await'表达式》经验,为你挑选了1个好方法。

我想用的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.我正在寻找一种方法来与协同程序中的那些模块互操作.



1> Jashandeep S..:

你应该使用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.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有