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:)