Um Guia para Principiantes de Python Tornado

A web agora é um grande lugar. Precisamos de apoiar milhares de clientes de cada vez, e aí vem o Tornado. Tornado é uma estrutura web Python e biblioteca de rede assíncrona, originalmente desenvolvida em FriendFreed.

Tornado usa rede não-bloqueante-io. Devido a isso, ele pode lidar com milhares de conexões de servidores ativos. É um salvador para aplicações onde são mantidas longas sondagens e um grande número de conexões ativas.

Tornado não é como a maioria dos frameworks Python. Ele não é baseado no WSGI, enquanto ele suporta algumas características do WSGI utilizando o módulo `tornado.wsgi`. Ele utiliza um design de loop de eventos que torna a execução de requisição Tornado mais rápida.

O que é o programa Synchronous?

Um bloco de funções, executa seu cálculo, e retorna, uma vez feito . Uma função pode bloquear por vários motivos: E/S da rede, E/S do disco, mutexes, etc.

A performance da aplicação depende de quão eficientemente a aplicação utiliza ciclos de CPU, por isso as instruções/chamadas de bloqueio devem ser levadas a sério. Considere funções de hashing de senha como bcrypt, que por projeto usam centenas de milissegundos de tempo de CPU, muito mais do que uma rede ou acesso a disco típico. Como a CPU não está ociosa, não há necessidade de funções assíncronas.

Uma função pode estar bloqueando em uma, e não-bloqueando em outras. No contexto do Tornado, geralmente consideramos bloqueio devido à E/S e disco da rede, embora todos os tipos de bloqueio precisem ser minimizados.

O que é o Programa Assíncrono?

1) Arquitetura com rosca única:

Significa que não pode fazer tarefas centradas em computação em paralelo.

2) Concorrência de E/S:

Pode transferir tarefas de E/S para o sistema operacional e continuar para a próxima tarefa para alcançar o paralelismo.

3) epoll/ kqueue:

Underline construção relacionada ao sistema que permite a uma aplicação obter eventos em um descritor de arquivo ou tarefas específicas de E/S.

4) Loop de eventos:

Utiliza epoll ou kqueue para verificar se algum evento aconteceu, e executa callback que está esperando por esses eventos de rede.

Asynchronous vs Synchronous Web Framework:

Em caso de modelo síncrono, cada requisição ou tarefa é transferida para thread ou roteamento, e ao terminar, o resultado é entregue ao chamador. Aqui, gerenciar as coisas é fácil, mas criar novas threads é muito overhead.

Por outro lado, em Asynchronous framework, como Node.js, há um modelo com uma única thread, então muito menos overhead, mas tem complexidade.

Vamos imaginar milhares de requisições chegando e um servidor usa loop de eventos e callback. Agora, até que o pedido seja processado, ele tem que armazenar e gerenciar eficientemente o estado desse pedido para mapear o resultado da callback para o cliente real.

Node.js vs Tornado

A maior parte desses pontos de comparação estão ligados à linguagem de programação real e não ao framework:

  • Node.js tem uma grande vantagem que todas as suas bibliotecas são Async. Em Python, há muitos pacotes disponíveis, mas muito poucos deles são assíncronos
  • Como Node.js é JavaScript runtime, e podemos usar JS tanto para front como back-end, os desenvolvedores podem manter apenas uma base de código e compartilhar a mesma biblioteca de utilitários
  • O motor V8 do Google torna o Node.js mais rápido que o Tornado. Mas muitas das bibliotecas Python são escritas em C e podem ser alternativas mais rápidas.

Um simples ‘Hello World’ Exemplo

CODE: https://gist.github.com/velotiotech/b4d91554b739f2487bf6131ac65ec06d.js

Nota: Este exemplo não utiliza nenhum recurso assíncrono.

Utilizando o módulo AsyncHTTPClient, podemos fazer chamadas REST de forma assíncrona.

CODE: https://gist.github.com/velotiotech/5fe63eb5fd6cf3af9bf353c2fd3b4ca7.js

Como você pode ver `yield http_client.fetch(url)` será executado como um coroutine.

Exemplo Complexo de Tornado Async

Por favor, dê uma olhada em Asynchronous Request handler.

WebSockets Using Tornado:

Tornado tem pacote embutido para WebSockets que pode ser facilmente usado com coroutines para conseguir concorrência, aqui está um exemplo:

CODE: https://gist.github.com/velotiotech/34d0a0e0ecd57818ae1db1697c075777.js

Uma pessoa pode usar uma aplicação cliente WebSocket para se conectar ao servidor, a mensagem pode ser qualquer número inteiro. Após o processamento, o cliente recebe o resultado se o número inteiro é principal ou não.
Aqui está mais um exemplo de características assimétricas reais do Tornado. Muitos irão encontrá-lo semelhante ao Goroutine e canais.

Neste exemplo, podemos iniciar o(s) trabalhador(es) e eles irão ouvir o ‘tornado.queue’. Esta fila é assíncrona e muito semelhante ao pacote asyncio.

CODE: https://gist.github.com/velotiotech/1477131948ca23879167df0281726d02.js

Conclusão

1) frameworks assíncronos não são muito úteis quando a maioria dos cálculos são centrados em CPU e não em E/S.

2) Devido a um único thread por modelo core e loop de eventos, ele pode gerenciar milhares de conexões a clientes ativos.

3) Muitos dizem que Django é muito grande, Flask é muito pequeno, e Tornado é exatamente o correto:)

Deixe uma resposta

O seu endereço de email não será publicado.