Python assíncio.wait()

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(ou intou float) especifica um número máximo de segundos de espera antes de retornar o resultado.
  • return_whenindica quando a função deve retornar. O return_whenaceita 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_EXCEPTIONserá equivalente a ALL_COMPLETED.
ALL_COMPLETED Retorne quando todos os aguardáveis ​​forem concluídos ou cancelados.

Observe que essas constantes estão na asynciobiblioteca 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 APIErrorclasse que estende a Exceptionclasse:

class APIError(Exception):
    passLinguagem 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 resultLinguagem 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 whileloop. Se todas as tarefas forem concluídas, a pendência ficará vazia e o whileloop será encerrado. Em cada iteração, obtemos a tarefa concluída do doneconjunto 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *