Resumo : neste tutorial, você aprenderá sobre corrotinas Python e como usar Python async
e await
palavras-chave para criar e pausar corrotinas.
Introdução às corrotinas Python
Uma corrotina é uma função regular com a capacidade de pausar sua execução ao encontrar uma operação que pode demorar um pouco para ser concluída.
Quando a operação de longa duração for concluída, você poderá retomar a corrotina pausada e executar o código restante nessa corrotina.
Enquanto a corrotina aguarda a operação de longa execução, você pode executar outro código. Ao fazer isso, você pode executar o programa de forma assíncrona para melhorar seu desempenho.
Para criar e pausar uma corrotina, você usa Python async
e await
palavras-chave:
- A
async
palavra-chave cria uma corrotina. - A
await
palavra-chave pausa uma corrotina.
Definindo uma corrotina com palavra-chave Python assíncrona
O seguinte define uma função simples que retorna o número quadrado de um inteiro:
def square(number: int) -> int:
return number*number
Linguagem de código: Python ( python )
E você pode passar um número inteiro para a square()
função para obter seu número quadrado:
def square(number: int) -> int:
return number*number
result = square(10)
print(result)
Linguagem de código: Python ( python )
Saída:
100
Linguagem de código: Python ( python )
Quando você adiciona a async
palavra-chave à função, a função se torna uma corrotina:
async def square(number: int) -> int:
return number*number
Linguagem de código: Python ( python )
Uma corrotina de chamada retorna um objeto de corrotina que será executado posteriormente. Por exemplo:
async def square(number: int) -> int:
return number*number
result = square(10)
print(result)
Linguagem de código: Python ( python )
Saída:
<coroutine object square at 0x00000185C31E7D80>
sys:1: RuntimeWarning: coroutine 'square' was never awaited
Linguagem de código: Python ( python )
Neste exemplo, chamamos a square()
corrotina, atribuímos o valor retornado à result
variável e o imprimimos.
Quando você chama uma corrotina, o Python não executa o código dentro da corrotina imediatamente. Em vez disso, ele retorna um objeto de co-rotina.
A segunda linha da saída também mostra uma mensagem de erro indicando que a corrotina nunca foi aguardada. Mais sobre isso na await
seção a seguir:
sys:1: RuntimeWarning: coroutine 'square' was never awaited
Linguagem de código: JavaScript ( javascript )
Para executar uma corrotina, você precisa executá-la em um loop de eventos . Antes do Python 3.7, você precisava criar manualmente um loop de eventos para executar corrotinas e fechar o loop de eventos.
Porém, desde a versão 3.7, a asyncio
biblioteca adicionou algumas funções que simplificam o gerenciamento do loop de eventos.
Por exemplo, você pode usar a asyncio.run()
função para criar automaticamente um loop de eventos, executar uma corrotina e fechá-la.
O seguinte usa a asyncio.run()
função para executar a square()
corrotina e obter o resultado:
import asyncio
async def square(number: int) -> int:
return number*number
result = asyncio.run(square(10))
print(result)
Linguagem de código: Python ( python )
Saída:
100
Linguagem de código: Python ( python )
É importante observar que o asyncio.run()
foi projetado para ser o principal ponto de entrada de um asyncio
programa.
Além disso, a asyncio.run()
função executa apenas uma corrotina que pode chamar outras corrotinas e funções no programa.
Pausando uma corrotina com a palavra-chave Python wait
A await
palavra-chave pausa a execução de uma corrotina. A await
palavra-chave é seguida por uma chamada para uma corrotina como esta:
result = await my_coroutine()
Linguagem de código: Python ( python )
A await
palavra-chave faz com que my_coroutine()
o código seja executado, aguarda a conclusão do código e retorna um resultado.
É importante observar que await
a palavra-chave só é válida dentro de uma corrotina. Em outras palavras, você deve usar a await
palavra-chave dentro de uma corrotina.
Este é o motivo pelo qual você viu uma mensagem de erro no exemplo acima que usa a await
palavra-chave fora de uma corrotina.
O exemplo a seguir mostra como usar a await
palavra-chave para pausar uma corrotina:
import asyncio
async def square(number: int) -> int:
return number*number
async def main() -> None:
x = await square(10)
print(f'x={x}')
y = await square(5)
print(f'y={y}')
print(f'total={x+y}')
if __name__ == '__main__':
asyncio.run(main())
Linguagem de código: Python ( python )
Saída:
x=100
y=25
total=125
Linguagem de código: Python ( python )
Como funciona. (vamos nos concentrar na main()
função):
Primeiro, chame a
corrotina usando a square()
await
palavra-chave. A await
palavra-chave irá pausar a execução da main()
corrotina, aguardar a
conclusão da corrotina e retornar o resultado:square()
x = await square(10)
print(f'x={x}')
Linguagem de código: Python ( python )
Segundo, chame a square()
corrotina uma segunda vez usando a await
palavra-chave:
y = await square(5)
print(f'y={y}')
Linguagem de código: Python ( python )
Terceiro, exiba o total:
print(f'total={x+y}')
Linguagem de código: Python ( python )
A instrução a seguir usa a run()
função para executar a main()
corrotina e gerenciar o loop de eventos:
asyncio.run(main())
Linguagem de código: Python ( python )
Até agora, nosso programa é executado como um programa síncrono. Não revela o poder do modelo de programação assíncrona.
Resumo
- Uma corrotina é uma função regular com o poder de pausar uma operação de longa duração, aguardar o resultado e retomar a partir do ponto pausado.
- Use
async
palavra-chave para definir uma corrotina. - Use
await
palavra-chave para pausar uma corrotina. - Use
asyncio.run()
a função para executar automaticamente uma corrotina em um loop de eventos e gerenciar um loop de eventos.