Resumo : neste tutorial, você aprenderá sobre o loop de eventos do Python e como o Python o utiliza para obter o modelo de simultaneidade usando um único thread.
Introdução ao loop de eventos Python
Simultaneidade significa que várias tarefas podem ser executadas ao mesmo tempo. O asyncio
pacote integrado permite executar tarefas simultaneamente usando um único thread .
Para obter um modelo de simultaneidade de thread único, o asyncio
pacote usa uma construção chamada loop de eventos. Para entender como funciona o loop de eventos, vamos dar um exemplo de gravação de dados em um arquivo.
Ao gravar dados em um arquivo , você executa as seguintes etapas:
- Abra o arquivo
- Grave dados em um arquivo e espere que ele seja concluído
- Feche o arquivo
Neste fluxo, a segunda tarefa é o bloqueio. Internamente funciona assim:
- Primeiro, a função, que grava dados no arquivo, envia dados para o sistema operacional (SO).
- Em segundo lugar, o sistema operacional assume o controle e começa a gravar dados no arquivo.
- Terceiro, o sistema operacional notifica o programa assim que conclui a gravação do arquivo.
Para gerenciar as notificações, os diferentes sistemas operacionais usam diferentes sistemas de notificação de eventos. Por exemplo:
SO | Sistema de notificação de eventos |
---|---|
Linux | epoll |
janelas | Porta de conclusão de E/S (IOCP) |
Mac OS | kqueue |
Esses sistemas de notificação de eventos nos permitem obter simultaneidade usando um único thread . Enquanto o programa espera que o sistema operacional notifique a conclusão, ele pode executar outro código.
No modelo de simultaneidade de thread único, temos apenas um thread executando código Python a qualquer momento. Quando encontramos uma tarefa vinculada a E/S, nós a entregamos ao sistema de notificação de eventos do sistema operacional e executamos outro código.
Quando a tarefa vinculada a E/S for concluída, podemos retomar a tarefa que estava aguardando o resultado e executar o código que segue a tarefa vinculada a E/S.
Para acompanhar as tarefas vinculadas a E/S que estão aguardando resultados, o asyncio
pacote usa um loop de eventos. A imagem a seguir ilustra como funciona o loop de eventos:
Como funciona.
- Primeiro, o thread principal envia tarefas para uma fila de tarefas.
- Em segundo lugar, o loop de eventos monitora constantemente a fila de tarefas e executa a tarefa até contrariar as tarefas de E/S. Nesse caso, o loop de eventos pausa a tarefa e a transfere para o sistema operacional.
- Terceiro, verifique as tarefas de IO concluídas. Se a tarefa for concluída, o sistema operacional notificará o programa. O loop de eventos executa as tarefas não pausadas.
Essas etapas são repetidas até que a fila de tarefas esteja vazia.
Antes do Python 3.7, você precisava criar um loop de eventos e executar tarefas manualmente. Felizmente, após o Python 3.7, o asyncio
pacote fornece algumas funções que permitem gerenciar automaticamente o loop de eventos para que você não precise lidar com APIs de baixo nível.
No próximo tutorial, você aprenderá como definir corrotinas usando a async
palavra-chave e pausá-las usando a await
palavra-chave.
Resumo
- Simultaneidade significa executar várias tarefas ao mesmo tempo.
- O loop de eventos é responsável por obter tarefas de uma fila de eventos e tratá-las.
- O
asyncio
pacote usa um loop de eventos para obter um modelo de simultaneidade de thread único.