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?
Respostas:
"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
fonte
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!
fonte
spawnProcess
, esse agendamento de E / S também pode ser convertido em agendamento da CPU.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:
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.inlineCallbacks
no Twisted).Codebase
O melhor comentário é do site http://cyclone.io . ciclone tenta misturar Twisted e Tornado porque:
Mas em 2011
tornado.platform.twisted
foi 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.process
e 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.twisted
mó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.
fonte
( 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
geventreactor
que permite aproveitar de maneira relativamente suave o melhor dos dois mundos, a saber:inlineCallbacks
simplesmente 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:yield
e emDeferreds
toda parte; frequentemente difícil construir algumas abstrações; terrivelmente inútil traços de pilha com ambos os nusDeferred
, bem como, e mais ainda com@inlineCallbacks
.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, nasgeventreactor
quais publicarei em breve, como parte dogeventreactor
repositó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
,urllib2
e 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
Deferred
retornos 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.)
fonte