Resumo : neste tutorial, você aprenderá sobre a asyncio.wait()
função para executar um iterável de objetos aguardáveis simultaneamente.
Introdução à função asyncio wait() do Python
A asyncio.wait()
função executa um iterável de objetos e blocos aguardáveis até uma condição especificada.
Aqui está a sintaxe da asyncio.wait()
função:
asyncio.wait(aws, *, timeout=None, return_when=ALL_COMPLETED)
Linguagem de código: Python ( python )
A asyncio.wait()
função possui os seguintes parâmetros:
aws
é iterável para objetos aguardáveis que você deseja executar simultaneamente.timeout
(ouint
oufloat
) especifica um número máximo de segundos de espera antes de retornar o resultado.return_when
indica quando a função deve retornar. Oreturn_when
aceita uma das constantes da tabela abaixo.
Constante | Descrição |
---|---|
FIRST_COMPLETED |
Retorne quando todos os aguardáveis forem concluídos ou cancelados. |
FIRST_EXCEPTION |
Retorne quando qualquer aguardável for concluído, gerando uma exceção. Se nenhum awaitable gerar uma exceção, the FIRST_EXCEPTION será equivalente a ALL_COMPLETED . |
ALL_COMPLETED |
Retorne quando todos os aguardáveis forem concluídos ou cancelados. |
Observe que essas constantes estão na asyncio
biblioteca para que você possa referenciá-las comoasyncio.FIRST_COMPLETED
O asyncio.wait()
retorna dois conjuntos:
done, pending = await asyncio.wait(aws)
Linguagem de código: Python ( python )
done
é um conjunto de aguardáveis que são concluídos.pending
é um conjunto de aguardáveis que estão pendentes.
Exemplos de função Python assíncio wait()
O exemplo a seguir ilustra como usar a asyncio.wait()
função:
import asyncio
from asyncio import create_task
class APIError(Exception):
pass
async def call_api(message, result=100, delay=3, raise_exception=False):
print(message)
await asyncio.sleep(delay)
if raise_exception:
raise APIError
else:
return result
async def main():
task_1 = create_task(call_api('calling API 1...', result=1, delay=1))
task_2 = create_task(call_api('calling API 2...', result=2, delay=2))
task_3 = create_task(call_api('calling API 3...', result=3, delay=3))
pending = (task_1, task_2, task_3)
while pending:
done, pending = await asyncio.wait(
pending,
return_when=asyncio.FIRST_COMPLETED
)
result = done.pop().result()
print(result)
asyncio.run(main())
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina a APIError
classe que estende a Exception
classe:
class APIError(Exception):
pass
Linguagem de código: Python ( python )
Segundo, defina a call_api()
função que simula uma operação assíncrona:
async def call_api(message, result=100, delay=3, raise_exception=False):
print(message)
await asyncio.sleep(delay)
if raise_exception:
raise APIError
else:
return result
Linguagem de código: Python ( python )
Terceiro, crie três tarefas que envolvam as call_api()
corrotinas. Cada corrotina retorna um número diferente:
task_1 = create_task(call_api('calling API 1...', result=1, delay=1))
task_2 = create_task(call_api('calling API 2...', result=2, delay=2))
task_3 = create_task(call_api('calling API 3...', result=3, delay=3))
pending = (task_1, task_2, task_3)
Linguagem de código: Python ( python )
Por fim, chame a asyncio.wait()
função para executar as tarefas dentro de um while
loop. Se todas as tarefas forem concluídas, a pendência ficará vazia e o while
loop será encerrado. Em cada iteração, obtemos a tarefa concluída do done
conjunto e exibimos o resultado:
while pending:
done, pending = await asyncio.wait(
pending,
return_when=asyncio.FIRST_COMPLETED
)
result = done.pop().result()
print(result)
Linguagem de código: Python ( python )
Resumo
- Use o
asyncio.wait()
para executar tarefas de forma iterável simultaneamente.