tutorial run has gather espaƱol await attribute asyncio async python python-3.x async-await future python-asyncio

python - run - Combina objetos como Promise.all



python async await (1)

El equivalente sería usar asyncio.wait :

import asyncio async def bar(i): print(''started'', i) await asyncio.sleep(1) print(''finished'', i) async def main(): await asyncio.wait([bar(i) for i in range(10)]) loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()

¿Por qué no funciona mi enfoque?

Porque cuando await cada artículo en la secuencia, bloqueas esa rutina. Entonces, en esencia, tienes un código síncrono que se hace pasar por async. Si realmente lo desea , puede implementar su propia versión de asyncio.wait utilizando loop.create_task o asyncio.ensure_future .

EDITAR

Como mencionó Andrew, también puedes usar asyncio.gather .

En JavaScript asíncrono, es fácil ejecutar tareas en paralelo y esperar a que todas se completen utilizando Promise.all :

async function bar(i) { console.log(''started'', i); await delay(1000); console.log(''finished'', i); } async function foo() { await Promise.all([bar(1), bar(2)]); } // This works too: async function my_all(promises) { for (let p of promises) await p; } async function foo() { await my_all([bar(1), bar(2), bar(3)]); }

Intenté reescribir este último en python:

import asyncio async def bar(i): print(''started'', i) await asyncio.sleep(1) print(''finished'', i) async def aio_all(seq): for f in seq: await f async def main(): await aio_all([bar(i) for i in range(10)]) loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close()

Pero ejecuta mis tareas secuencialmente.

¿Cuál es la forma más sencilla de esperar múltiples pendientes? ¿Por qué no funciona mi enfoque?