簡體   English   中英

從Executor等待Future:Future不能用於'await'表達式

[英]Await Future from Executor: Future can't be used in 'await' expression

我想使用python協同程序中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 executor.submit返回的Future對象?

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旨在與事件循環一起使用並且是等待的 ,而前者則不是。 loop.run_in_executor提供了兩者之間必要的互操作性。

編輯#2

使用executor.submit不是我的決定。 這在幾個庫內部使用,例如請求期貨。 我正在尋找一種方法來與協同程序中的那些模塊互操作。

編輯#3

從python 3.5( docs )開始,您可以使用asyncio.wrap_future(future, *, loop=None)concurrent.futures.Future轉換為asyncio.Future

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM