Compartilhamento de tecnologia

O que são corrotinas em Python e como implementar programação assíncrona em Python

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Corotina

Uma corrotina é um componente do programa que permite que vários pontos de entrada de um programa suspendam e retomem a execução em locais específicos. Ao contrário de threads e processos, a troca de corrotinas é explicitamente controlada pelo programador, em vez de programada pelo sistema operacional. Isso torna a corrotina mais leve ao realizar trocas de contexto, pois não há necessidade de salvar e restaurar todo o ambiente de execução (como a pilha de threads).

Em Python, as corrotinas passam principalmenteasynceawait Palavras-chave a serem alcançadas. As funções definidas usando essas palavras-chave são chamadas de "funções de corrotina" e não são executadas imediatamente quando chamadas, mas retornam um objeto de corrotina. Este objeto de corrotina precisa ser agendado para execução no loop de eventos.

Programação Assíncrona

A programação assíncrona é um modelo de simultaneidade que permite que um programa continue executando outras tarefas enquanto aguarda a conclusão de certas operações de longa duração (como operações de E/S). Em Python, a programação assíncrona é frequentemente usada com corrotinas, cuja execução é agendada através de um loop de eventos.

Como implementar programação assíncrona em Python

1. Usoasynceawait
  • Definir função de corrotina:usarasync defpara definir a função de co-rotina.
  • Aguarde a corrotina: Dentro da função corrotina, você pode usarawaitaguardar a conclusão de outra co-rotina ou operação assíncrona.
2. Use loop de eventos
  • Pitãoasyncio A biblioteca fornece uma implementação do loop de eventos. Você precisa ter certeza de que seu código assíncrono é executado em algum loop de eventos.
  • usarasyncio.run(main())para executar sua função principal de corrotina, que cria e gerencia automaticamente o loop de eventos.
3. Exemplo de código
 

python复制代码

import asyncio
# 定义一个异步函数,模拟一个耗时的I/O操作
async def fetch_data(url):
print(f"Fetching {url}...")
# 模拟耗时操作
await asyncio.sleep(1)
return f"Data from {url}"
async def main():
# 同时启动多个异步任务
task1 = asyncio.create_task(fetch_data('http://example.com/data1'))
task2 = asyncio.create_task(fetch_data('http://example.com/data2'))
# 等待所有任务完成
result1, result2 = await asyncio.gather(task1, task2)
print(result1)
print(result2)
# 运行主协程
asyncio.run(main())

Neste exemplo,fetch_dataÉ uma função assíncrona que simula solicitações de rede.mainNa função, iniciamos dois ao mesmo tempofetch_datauma tarefa assíncrona e usoawait asyncio.gather()Espere que eles terminem ao mesmo tempo.

4. Precauções
  • A programação assíncrona e as corrotinas facilitam o tratamento da simultaneidade, mas também introduzem novas complexidades, como gerenciamento de contexto assíncrono, tratamento de erros, etc.
  • Ao projetar código assíncrono, preste atenção especial às operações que estão bloqueando (por exemplo, operações de E/S síncronas) e use versões assíncronas de bibliotecas e APIs sempre que possível.
  • asyncio Faz parte da biblioteca padrão Python e é usado para oferecer suporte a corrotinas e programação assíncrona.Ele também fornece API rica, comoasyncio.Queueasyncio.Locketc., para lidar com problemas de simultaneidade e sincronização em código assíncrono.