run - python async await
Esperar el futuro del ejecutor: el futuro no se puede usar en la expresión ''aguardar'' (1)
Deberías usar 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()
EDITAR
concurrent.futures.Future
object son diferentes de asyncio.Future
. El asyncio.Future
está destinado a ser utilizado con bucles de eventos y es aguardable , mientras que el anterior no lo es. loop.run_in_executor
proporciona la interoperabilidad necesaria entre los dos.
EDIT # 2
Usar executor.submit no es mi decisión. Esto es usado internamente por varias bibliotecas, como solicitudes-futuros. Estoy buscando una forma de interoperar con esos módulos de corutinas.
Aunque no está documentado, puede usar asyncio.wrap_future(future, *, loop=None)
para convertir un concurrent.futures.Future
en un asyncio.Future
.
Quería usar un ThreadPoolExecutor de un python coroutine , para delegar algunas llamadas de red de bloqueo a un hilo separado. Sin embargo, ejecutando el siguiente código:
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()
causa un error:
TypeError: object Future can''t be used in ''await'' expression
¿ Future
objetos Future
no son aguardables ? ¿Por qué dice que no?
¿Cómo puedo await
un objeto Future
devuelto por executor.submit
?
Python 3.5.0
EDITAR
Usar executor.submit
no es mi decisión. Esto es usado internamente por varias bibliotecas, como requests-futures
. Estoy buscando una forma de interoperar con esos módulos de corutinas.