Quando usar o Tornado, quando usar o Twisted / Cyclone / GEvent / other [fechado]


181

Qual dessas estruturas / bibliotecas seria a melhor escolha para criar aplicativos da web modernos para vários usuários? Eu adoraria ter um servidor da Web assíncrono que me permita escalar facilmente. Qual solução fornecerá o melhor desempenho / escalabilidade / estrutura mais útil (em termos de facilidade de uso e facilidade de desenvolvimento)?

Seria ótimo se ele fornecer uma boa funcionalidade (websockets, rpc, streaming, etc.).

Quais são os prós e os contras de cada solução?


Precisa ser uma dessas estruturas? Qual é o seu planejamento para fazer e algo como Django, Pylons, etc ... funciona?
Joe Doherty

Não, claro que não, mas eu adoraria que fosse assíncrono e tivesse um bom suporte para websockets - atualizei a pergunta também. Obrigado.
Wojciech Danilo

3
É uma pergunta ampla, não é?
Jean-Paul Calderone

Sua escolha depende das bibliotecas que você deseja usar. Suas bibliotecas - na tarefa, que você deseja resolver.
Nikolay Fominyh

1
Sim, é amplo, mas talvez seja possível. Gostaria de saber se essas bibliotecas são usadas na produção e alguém, que as usa todos os dias, é capaz de dizer o que são ótimas, o que lhes falta, etc. Qual deve ser a linha de base para escolher uma biblioteca - talvez Twisted deva ser considerado depreciado quando se fala em Autobahn ou Cyclone? Ou talvez a Autobahn e o Cyclone não estejam prontos para produção e sua manutenção esteja em questão? Ou talvez o Tornado tenha um design mais moderno e o futuro provavelmente brilhe e seja ótimo e seja a escolha para o projeto de inicialização?
Wojciech Danilo

Respostas:


226

"O Django é uma estrutura da Web Python de alto nível que incentiva o desenvolvimento rápido e o design limpo e pragmático" . Se você está construindo algo semelhante a um site de comércio eletrônico, provavelmente deve usar o Django. Seu trabalho será concluído rapidamente. Você não precisa se preocupar com muitas opções de tecnologia. Ele fornece tudo o que você precisa, do mecanismo de modelo ao ORM. Será um pouco opinativo sobre a maneira como você estrutura seu aplicativo, o que é bom. Se você me perguntar. E possui a comunidade mais forte de todas as outras bibliotecas, o que significa que ajuda fácil está disponível.

"O Flask é uma microframework para Python baseado em Werkzeug, Jinja 2 e boas intenções" . Cuidado - "microframework" pode ser enganoso. Isso não significa que o Flask seja uma biblioteca meia cozida. Isso significa que o núcleo do frasco é muito, muito simples. Ao contrário do Django, ele não tomará nenhuma decisão sobre tecnologia para você. Você é livre para escolher qualquer mecanismo de modelo ou ORM que lhe agrade. Mesmo que ele venha com o mecanismo de modelo Jinja por padrão, você sempre pode escolher o nosso. Tanto quanto sei, o Flask é útil para escrever pontos de extremidade de APIs (serviços RESTful).

" Twisted é um mecanismo de rede orientado a eventos escrito em python" . Este é um mecanismo de alto desempenho. A principal razão para a sua velocidade é algo chamado de diferido. Torcido é construído sobre adiados. Para aqueles que não conhecem os adiados, é o mecanismo através da arquitetura assíncrona. Torcido é muito rápido. Mas não é adequado para escrever aplicativos da web convencionais. Se você quiser fazer algo de rede de baixo nível, o twisted é seu amigo.

" Tornado é uma estrutura da Web Python e uma biblioteca de rede assíncrona, desenvolvida originalmente no FriendFeed. Ao usar a E / S de rede sem bloqueio, o Tornado pode ser escalado para dezenas de milhares de conexões abertas, tornando-o ideal para pesquisas longas, WebSockets e outros aplicativos. que exigem uma conexão duradoura com cada usuário " . Tornado fica em algum lugar entre Django e Flask. Se você quiser escrever algo com Django ou Flask, mas se precisar de um desempenho melhor, poderá optar pelo Tornado. ele pode lidar muito bem com o problema C10k se ele for arquitetado corretamente.

"O Cyclone é uma estrutura de servidor web para Python que implementa a API do Tornado como um protocolo Twisted" . Agora, e se você quiser algo que tenha quase o mesmo desempenho que o Twisted, mas fácil de criar aplicativos da web convencionais? Diga olá ao ciclone. Eu preferiria o Cyclone a Tornado. Possui uma API muito semelhante ao Tornado. Por uma questão de fato, este é um garfo de Tornado. Mas o problema é que ele tem uma comunidade relativamente pequena. Alexandre Fiori é o único principal responsável pelo repo.

"O Pyramid é uma estrutura geral de desenvolvimento de aplicativos Web Python de código aberto. Seu principal objetivo é facilitar a criação de aplicativos Web para um desenvolvedor Python." Eu realmente não usei o Pyramid, mas examinei a documentação. Pelo que entendi, Pyramid é muito semelhante ao Flask e acho que você pode usá-lo sempre que o Flask parecer apropriado e vice-versa.

EDIT : Solicitação de revisão de quaisquer outras estruturas são bem-vindas!

Fonte: http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html


1
Django é o meu framework preferido. Sua documentação é muito boa e o ORM é fácil. O sul é ótimo para migrações de esquemas de banco de dados ... Mas a pergunta continha isso: "Gostaria muito de ter um servidor da Web assíncrono que me permita escalar facilmente.". O Django foi criado para sites clássicos de solicitação + resposta, não para assíncrono.
guettli

1
Você pode escrever sobre Pyramid?
Fizer Khan

5
@FizerKhan: Conforme sua solicitação, atualizei a resposta. Lamentamos que demorou tanto tempo. Não teve tempo de usar o Pyramid. Mas eu examinei a documentação.
Dhilipsiva

1
Eu acrescentaria que o ambiente de thread único usado pelo Tornado é muito mais suscetível a erros - um erro que torna o código de um único ponto de extremidade da API mais lento causará facilmente problemas para todos os pontos de extremidade.
Abel Molina

1
Você poderia fazer um comentário sobre cherrypy?
Stavros Avramidis

60

Obviamente, essa é uma resposta tendenciosa , mas não é a mesma coisa que uma resposta errada ; você sempre deve usar o Twisted. Já respondi perguntas semelhantes antes, mas como sua pergunta não é a mesma, aqui estão alguns motivos:

"Melhor performance"

O Twisted monitora continuamente nosso desempenho no site speed.twistedmatrix.com . Também fomos um dos primeiros projetos a serem monitorados pelo site semelhante do PyPy , garantindo assim o bom desempenho do Twisted no tempo de execução que qualquer pessoa interessada em aplicativos de alto desempenho no Python.

"Escalabilidade"

Que eu saiba, nenhuma das estruturas listadas tem suporte interno para dimensionamento automático; são todas estruturas de comunicação, portanto, você deve fazer o trabalho para se comunicar entre os nós de dimensionamento. No entanto, o Twisted tem uma vantagem em seu suporte interno ao multiprocessamento local . Para ser justo, há um complemento de terceiros para o Tornado que permite fazer a mesma coisa. Nas versões recentes, o Twisted adicionou recursos que aumentam o número de maneiras de compartilhar o trabalho entre núcleos, e o trabalho está em andamento nessa área. O Twisted também possui alguns protocolos RPC "nativos" bem integrados , que oferecem um kit de construção para qualquer idioma de dimensionamento que você deseja buscar.

"Muito útil"

Muitas pessoas parecem achar o Twisted muito útil . Tanto é assim que muitos deles o estenderam e disponibilizaram suas extensões para você.

"Funcionalidade"

Fora da caixa, Twisted inclui:

Neste último departamento, pelo menos, o Twisted parece um vencedor claro para a funcionalidade incorporada. E tudo isso, em um pacote com pouco mais de 2 megabytes!


6
por que tantas pessoas dizem que não usam mais o Twisted, mas o GEvent?
Remdezx

1
Muitas pessoas dizem que é difícil manter grandes aplicativos usando o Twisted (devido à sua arquitetura de retorno de chamada): stackoverflow.com/questions/3048012/… Não seria melhor usar o Twisted baseado em gevent ou gevent?
Wojciech Danilo

8
@remdezx Quanto à sua pergunta, há duas razões. Uma é que as pessoas acham difícil entender o Twisted porque a programação simultânea é difícil de entender. Eles então mudam para o GEvent porque é superficialmente fácil de entender - desde que não haja simultaneidade, tudo funciona exatamente como você esperaria. A outra razão é que é muito menos trabalhoso portar código para o GEvent que não foi gravado usando uma API orientada a eventos para obter os benefícios de desempenho de E / S orientada a eventos. Se o seu código não compartilhar muito estado, essa porta provavelmente funcionará bem.
Glyph

1
@Glyph, você está falando de simultaneidade, mas ... nem o Gevent nem o Twisted suportam a simultaneidade (é claro que você pode usar o multiprocessamento com o gevent e usar um pool de threads reais e um pool de greenlets em cada thread - o que funciona bem para mim e você pode usar o plugin Twisted para fazer exatamente o mesmo - executar várias intenções distorcidas uma ao lado da outra). Mas Twisted dá a você algo mais do que um gevent? Eu acho que mesmo com várias instâncias de gevent / twisted, o gevent é mais fácil de entender e sem seus retornos de chamada explicitados. Estou esquecendo de algo?
Wojciech Danilo

2
@ danilo2 Sim, você está perdendo pelo menos uma coisa :). Especificamente, você está entendendo mal a palavra "simultaneidade" como "execução paralela simultânea em várias CPUs". O Twisted pode fazer programação de E / S simultânea por meio de E / S assíncrona (baseada em retorno de chamada). O GEvent pode fazer programação simultânea de E / S através de um agendador de microencadeamento. No Twisted, usando spawnProcess, esse agendamento de E / S também pode ser convertido em agendamento da CPU.
Glyph

48

Eu gosto da resposta @Glyph. Twisted é uma estrutura python rica e muito abrangente. Twisted e Tornado têm um design muito semelhante. E eu gosto muito desse design:

  • É rápido
  • fácil de entender
  • fácil de estender
  • não requer c-extensões
  • trabalha em PyPy.

Mas quero destacar Tornado , que eu prefiro e recentemente ganho popularidade. O Tornado, como o Twisted, usa programação no estilo de retorno de chamada, mas pode ser incorporado usando tornado.gen.engine( twisted.internet.inlineCallbacksno Twisted).

Codebase

O melhor comentário é do site http://cyclone.io . ciclone tenta misturar Twisted e Tornado porque:

Twisted é uma das bibliotecas mais maduras para E / S sem bloqueio disponível ao público. Tornado é a versão de código aberto do servidor web do FriendFeed, um dos servidores web mais populares e rápidos para Python, com uma API bastante decente para a criação de aplicativos web.

A idéia é conectar a API elegante e direta do Tornado ao Event-Loop da Twisted, permitindo um grande número de protocolos suportados.

Mas em 2011 tornado.platform.twistedfoi lançado o que traz funcionalidade semelhante.

atuação

Tornado tem desempenho muito melhor . Ele também funciona perfeitamente com o PyPy e obtém enormes ganhos.

Escalabilidade

O mesmo que Twisted. O Tornado tem tornado.processe muitos serviços rpc implementados em cima dele.

Funcionalidade

Existem 71 pacotes baseados no Tornado, comparados aos 148 Twisted e 48 Gevent. Mas se você olhar com cuidado e calcular a mediana do tempo de upload de pacotes, verá que os Twisted são os mais antigos, e Gevent e Tornado os mais novos. Além disso, existe um tornado.platform.twistedmódulo que permite executar o código escrito para Twisted on Tornado .

Resumo

Com o Tornado, você pode usar um código do Twisted. Não é necessário usar o ciclone, que apenas distorce seu código (seu código fica mais confuso).

Em 2014, o Tornado é considerado uma estrutura assíncrona padrão amplamente aceita e padrão, que funciona tanto em python2 quanto em python3. Além disso, a versão mais recente 4.x traz muitas funcionalidades de https://docs.python.org/dev/library/asyncio.html .

Escrevi um artigo explicando por que considero o Tornado - o melhor framework para web Python, onde escrevi muito mais sobre a funcionalidade do Tornado.


15

( ATUALIZAÇÃO : Estou tristemente surpreso com o quão poucas respostas aqui recomendam ou mesmo mencionam Gevent - acho que não é proporcional à popularidade, desempenho e facilidade de uso desta excelente biblioteca!)

Gevent e Twisted não são mutuamente exclusivos, embora o contrário possa parecer óbvio a princípio. Existe um projeto chamado geventreactorque permite aproveitar de maneira relativamente suave o melhor dos dois mundos, a saber:

  • O modelo de encadeamento eficiente e barato (verde cooperativo) da Gevent, que é muito mais fácil de programar quando se trata de simultaneidade - francamente, o Twisted's inlineCallbackssimplesmente não está preparado para o trabalho em termos de desempenho quando se trata de muitas corotinas, e nem em termos de facilidade / transparência de uso: yielde em Deferredstoda parte; frequentemente difícil construir algumas abstrações; terrivelmente inútil traços de pilha com ambos os nus Deferred, bem como, e mais ainda com @inlineCallbacks.
  • Toda a funcionalidade interna do Twisted com a qual você pode sonhar, incluindo, sem limitação IReactorProcess.spawnProcess.

Pessoalmente, atualmente estou usando o Gevent 1.0rc2 com o Twisted 12.3 em ponte geventreactor. Eu implementei minhas próprias adições e melhorias ainda não publicadas, nas geventreactorquais publicarei em breve, como parte do geventreactorrepositório original do GitHub: https://github.com/jyio/geventreactor .

Meu layout atual me permite programa no modelo de programação agradável de GEvent, e as coisas de alavancagem, como um non-blocking socket, urllib2e outros módulos. Eu posso usar código Python regular para fazer coisas regulares, em oposição à curva de aprendizado e ao inconveniente de fazer coisas simples e básicas da maneira Twisted. Também posso usar facilmente a maioria das bibliotecas de terceiros que normalmente estão fora de questão com o Twisted ou exigem o uso de threads.

Também posso evitar completamente a programação baseada em retorno de chamada estranha e muitas vezes excessivamente complexa usando greenlets (em vez de se Deferredretornos de chamada e / ou @inlineCallbacks).

(Esta resposta foi escrita com base em minhas experiências pessoais, usando o Twisted e o Gevent em projetos da vida real, com significativamente mais experiência no uso do Twisted (mas não pretendo ser um especialista do Twisted). O software que tive que escrever não teve que usar muitos recursos do Twisted, portanto, dependendo do conjunto de recursos que você precisa do Twisted, a complexidade extra (relativamente indolor) da mistura de Gevent e Twisted pode não valer a pena.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.