[英]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.