等待执行者的未来:未来不能用于 'await' 表达式
Await Future from Executor: Future can't be used in 'await' expression
我想使用 ThreadPoolExecutor from a python coroutine,将一些阻塞网络调用委托给单独的线程。但是,运行下面的代码:
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
object are different from asyncio.Future
。 asyncio.Future
旨在与事件循环一起使用,并且是 awaitable,而前者不是。 loop.run_in_executor
提供两者之间必要的互操作性。
编辑 #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
。
我想使用 ThreadPoolExecutor from a python coroutine,将一些阻塞网络调用委托给单独的线程。但是,运行下面的代码:
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
object are different from asyncio.Future
。 asyncio.Future
旨在与事件循环一起使用,并且是 awaitable,而前者不是。 loop.run_in_executor
提供两者之间必要的互操作性。
编辑 #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
。