Tornado ne zaman kullanılır, Twisted / Cyclone / GEvent / diğer ne zaman kullanılır [kapalı]


181

Bu çerçevelerden / kütüphanelerden hangileri modern çok kullanıcılı web uygulaması oluşturmak için en iyi seçimdir? Kolayca ölçeklenmemi sağlayacak asenkron bir web sunucusuna sahip olmak isterim. Hangi çözüm en iyi performansı / ölçeklenebilirliği / en kullanışlı çerçeveyi verecektir (kullanımı kolay ve geliştirilmesi kolay)?

İyi işlevsellik (websockets, rpc, streaming, vb.) Sağlaması harika olurdu .

Her çözümün artıları ve eksileri nelerdir?


Bu çerçevelerden biri olması gerekiyor mu? Ne yapmayı planlıyorsunuz ve Django, Pilonlar vb. Bir şey işe yarayabilir mi?
Joe Doherty

Hayır, corse değil, ama asenkron olacak ve websockets için iyi bir destek olup olmayacağını isterim - soruyu da güncelledim. Teşekkür ederim.
Wojciech Danilo

3
Geniş bir soru gibi, değil mi?
Jean-Paul Calderone

Seçiminiz kullanmak istediğiniz kitaplıklara bağlıdır. Kütüphaneleriniz - görevde, çözmek istediğiniz.
Nikolay Fominyh

1
Evet, geniş ama belki de olvut olabilir. Bu kütüphanelerin üretimde kullanılıp kullanılmadığını merak ediyorum ve bazılarını her gün kullanan biri neyin harika olduğunu, neyin eksik olduğunu vb. Söyleyebiliyor. Autobahn veya Cyclone hakkında konuşurken amortismana uğradı mı? Veya mmaybe Autobahn ve Cyclone üretime hazır değil ve bakımı sorgulanıyor mu? Ya da belki Tornado daha modern bir tasarıma sahiptir ve gelecek muhtemelen parlak ve harika olacak ve başlangıç ​​projesi için seçim olmalı?
Wojciech Danilo

Yanıtlar:


226

" Django , hızlı gelişimi ve temiz, pragmatik tasarımı teşvik eden üst düzey bir Python Web çerçevesidir" . Bir e-ticaret sitesine benzer bir şey inşa ediyorsanız, muhtemelen Django ile gitmelisiniz. İşinizi çabuk halledecektir. Çok fazla teknoloji seçeneği hakkında endişelenmenize gerek yok. Şablon motorundan ORM'ye kadar ihtiyacınız olan her şeyi sağlar. Bana sorarsanız iyi, uygulamanızı yapılandırma şekli hakkında biraz tartışılacak. Ve tüm diğer kütüphanelerin en güçlü topluluğuna sahiptir, bu da kolay yardımın mevcut olduğu anlamına gelir.

" Flask , Perkhon için Werkzeug, Jinja 2 ve iyi niyetlere dayanan bir mikro çerçevedir" . Dikkat - "mikroçerçeve" yanıltıcı olabilir. Bu, Flask'ın yarı pişmiş bir kütüphane olduğu anlamına gelmez. Bu, şişenin çekirdeğinin çok, çok basit olduğu anlamına gelir. Django'dan farklı olarak, sizin için herhangi bir Teknoloji kararı vermeyecektir. Sizi memnun eden herhangi bir şablon motoru veya ORM'yi seçmekte özgürsünüz. Varsayılan olarak Jinja şablon motoru ile gelse de, kendimizi seçmek her zaman ücretsizdir. Bildiğim kadarıyla Flask, API'ların uç noktalarını (RESTful Services) yazmak için kullanışlı geliyor.

" Twisted , python ile yazılmış olay güdümlü bir ağ motorudur" . Bu yüksek performanslı bir motordur. Hızının ana nedeni ertelenmiş olarak adlandırılan bir şeydir. Bükülmüş ertelemeler üzerine inşa edilmiştir. Ertelemeler hakkında bilgi sahibi olmayanlarınız için, bu zaman uyumsuz mimari ile elde edilen mekanizmadır. Bükülmüş çok hızlı. Ancak geleneksel webapps yazmak için uygun değildir. Düşük seviyeli bir ağ işi yapmak istiyorsanız, arkadaşınız bükülmüş.

" Tornado bir Python web çerçeve ve asenkron ağ kütüphanesi, aslen uzun yoklama, WebSockets için ideal hale G / Ç, Tornado açık bağlantı onbinlerce ölçeklenebilir engellenmeyen ağını kullanarak. FriendFeed geliştirilen ve diğer uygulamalar msgstr "her kullanıcıya uzun ömürlü bir bağlantı gerektiren" + + msgid " . Tornado, Django ve Flask arasında bir yerde duruyor. Django veya Flask ile bir şeyler yazmak istiyorsanız, ancak daha iyi bir performansa ihtiyacınız varsa, Tornado'yu tercih edebilirsiniz. doğru tasarlanmışsa C10k problemini çok iyi idare edebilir.

" Cyclone , Tornado API'sını Twisted protokolü olarak uygulayan Python için bir web sunucusu çerçevesidir" . Şimdi, Twisted kadar performans gösteren ama geleneksel webapps yazmak kolay bir şey istiyorsanız ne olacak? Siklona merhaba deyin. Tornado yerine Siklon'u tercih ederim. Tornado'ya çok benzeyen bir API'sı var. Aslında, bu bir Tornado çatalı. Ama sorun şu ki, nispeten küçük bir topluluğa sahip. Alexandre Fiori, repo için tek ana komiser.

" Piramit genel, açık kaynak kodlu, Python web uygulaması geliştirme çerçevesidir. Birincil hedefi, bir Python geliştiricisinin web uygulamaları oluşturmasını kolaylaştırmaktır." Piramidi gerçekten kullanmadım, ancak belgeleri inceledim. Anladığım kadarıyla, Piramit Flask'a çok benziyor ve sanırım Flask uygun göründüğü her yerde Piramit kullanabilirsiniz .

DÜZENLEME : Diğer çerçeveleri gözden geçirme isteği memnuniyetle karşılandı!

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


1
Django benim tercih ettiğim çerçeve. Dokümantasyonu çok iyi ve ORM kolaydır. Güney veritabanı şeması geçişleri için harika .... Ama soru bu içeriyordu: "Kolayca ölçeklendirmek için izin verecek asenkron bir web sunucusu sahip olmak isterim.". Django, async için değil, klasik istek + yanıt siteleri için yapıldı.
guettli

1
Piramit hakkında yazabilir misiniz?
Fizer Khan

5
@FizerKhan: İsteğinize göre cevabı güncelledim. Üzgünüm çok uzun sürdü. Piramit kullanmak için zamanım yoktu. Ama belgelere baktım.
dhilipsiva

1
Tornado'nun kullandığı tek iş parçacıklı ortamın hataya daha yatkın olduğunu ekleyebilirim - tek bir API uç noktası için kodu daha yavaş yapan bir hata, tüm uç noktalar için sorunlara neden olur.
Abel Molina

1
Cherrypy hakkında yorum yapabilir misiniz?
Stavros Avramidis

60

Bu açık bir şekilde taraflı bir cevaptır, ancak bu yanlış bir cevapla aynı şey değildir ; her zaman Twisted kullanmalısınız. Daha önce benzer soruları yanıtladım , ancak sorunuz tamamen aynı olmadığından, bazı nedenler şunlardır:

"En iyi performans"

Twisted, speed.twistedmatrix.com web sitesindeki performansımızı sürekli olarak izler . Ayrıca PyPy'nin benzer sitesi tarafından izlenen ilk projelerden biriydik , böylece Twisted'in Python'daki yüksek performanslı uygulamalarla ilgilenen herkesin çalışma zamanında iyi bir performans göstermesini sağladık .

"Ölçeklenebilirlik"

Bildiğim kadarıyla, listelenen çerçevelerin hiçbirinin otomatik ölçeklendirme için yerleşik bir desteği yoktur; hepsi iletişim çerçeveleridir, bu nedenle ölçeklendirme düğümleriniz arasında iletişim kurmak için işi yapmanız gerekir. Bununla birlikte, Twisted, yerel çoklu işleme için yerleşik desteğinde bir avantaja sahiptir . Adil olmak gerekirse, Tornado için aynı şeyi yapmanıza izin veren üçüncü taraf bir eklenti var . Son sürümlerde Twisted, çekirdekler arasında iş paylaşma yöntemlerinizi artıran özellikler ekledi ve bu alanda çalışmalar devam ediyor. Twisted ayrıca, izlemek istediğiniz ölçeklendirme deyimleri için bir inşaat kiti sunan iyi entegre edilmiş , "doğal" RPC protokollerine sahiptir.

"En kullanışlı"

Birçok insan Twisted'ı çok faydalı buluyor . Öyle ki, birçoğu onu genişletti ve uzantılarını sizin için kullanılabilir hale getirdi.

"İşlevsellik"

Kutunun dışında, Twisted şunları içerir:

En azından bu son bölümde, Twisted yerleşik işlevsellik için açık bir kazanan gibi görünüyor. Ve tüm bunlar, 2 megabayttan biraz fazla bir pakette!


6
neden bu kadar çok insan artık Twisted değil GEvent kullandıklarını söylüyor?
remdezx

1
Twisted kullanarak büyük uygulamaları korumanın zor olduğunu söyleyen birçok insan var (geri arama mimarisi nedeniyle): stackoverflow.com/questions/3048012/… Gevent veya gevent tabanlı Twisted kullanmak daha iyi olmaz mıydı?
Wojciech Danilo

8
@remdezx Sorunuza gelince, bunun iki nedeni var. Birincisi, insanların Twisted'ı anlaması zor olduğu için eşzamanlı programlamayı anlamak zor. Daha sonra GEvent'e geçerler çünkü anlaşılması yüzeysel olarak kolaydır - eşzamanlılık olmadığı sürece, her şey beklediğiniz gibi çalışır. Diğer bir neden, olay güdümlü G / Ç'nin performans avantajlarını elde etmek için olay güdümlü bir API kullanılarak yazılmamış olan GEvent'e kod üzerinden aktarmanın çok daha az çalışmasıdır. Kodunuz çok fazla durumu paylaşmıyorsa, böyle bir bağlantı noktası muhtemelen iyi çalışır.
Glif

1
@Glyph, eşzamanlılıktan bahsediyorsunuz, ama ... ne Gevent ne de Twisted destek eşzamanlılığı (elbette gevent ile çok işlemciliği kullanabilir ve her bir iş parçacığında gerçek iş parçacıkları ve yeşiller havuzu kullanabilirsiniz - bu benim için iyi çalışır ve tam olarak aynı şeyi yapmak için Twisted eklentisini kullanabilirsiniz - yan yana birden fazla bükülmüş örnek çalıştırın). Ama Twisted size gevent'ten daha fazlasını mı söylüyor? Bence birden fazla gevent / twisted örneğinde bile, gevent'in açıklayıcı geri çağrıları olmadan anlaşılması daha kolaydır. Bir şey mi kaçırıyorum?
Wojciech Danilo

2
@ danilo2 Evet, en az bir şey eksik :). Özellikle, "eşzamanlılık" kelimesini "birden fazla CPU'da eşzamanlı paralel yürütme" anlamına yanlış anlıyorsunuz. Twisted, eşzamansız (geri arama tabanlı) G / Ç yoluyla eşzamanlı G / Ç zamanlaması yapabilir. GEvent, bir mikro-iş parçacığı zamanlayıcı aracılığıyla eşzamanlı I / O zamanlaması yapabilir. Twisted'da, spawnProcessbu G / Ç zamanlaması CPU zamanlamasına da çevrilebilir.
Glif

48

@Glif yanıtını seviyorum. Twisted çok kapsamlı, zengin python çerçevesidir. Twisted ve Tornado çok benzer bir tasarıma sahiptir. Ve bu tasarımı çok seviyorum:

  • hızlı
  • anlaması kolay
  • uzatılması kolay
  • c-uzantısı gerektirmez
  • PyPy üzerinde çalışıyor.

Ama tercih ettiğim ve yakın zamanda popülerlik kazandığım Tornado'yu vurgulamak istiyorum . Tornado, Twisted gibi geri arama stili programlamayı kullanır, ancak tornado.gen.engine( Twisted'da) kullanılarak satır içine alınabilir twisted.internet.inlineCallbacks.

Codebase

En iyi yorum http://cyclone.io sitesinden. siklon Twisted ve Tornado'yu karıştırmaya çalışır çünkü:

Twisted, halka açık, engellemeyen I / O için en olgun kütüphanelerden biridir. Tornado, web uygulamaları oluşturmak için çok iyi bir API ile Python'un en popüler ve hızlı web sunucularından biri olan FriendFeed'in web sunucusunun açık kaynaklı sürümüdür.

Fikir Tornado'nun zarif ve anlaşılır API'sını Twisted'ın Event-Loop'una köprüleyerek çok sayıda desteklenen protokolü etkinleştirmektir.

Ancak 2011'de tornado.platform.twistedbenzer işlevsellik getiren çıktı.

Verim

Tornado çok daha iyi bir performansa sahiptir . Ayrıca PyPy ile sorunsuz bir şekilde çalışır ve büyük kazanç sağlar.

Ölçeklenebilirlik

Aynı Twisted gibi. Tornado tornado.processve üstüne uygulanan rpc hizmetleri bir sürü var.

İşlevsellik

148 Twisted ve 48 Gevent ile karşılaştırıldığında 71 Tornado tabanlı paket var. Ancak dikkatli bir şekilde bakarsanız ve paketlerin yükleme süresinin medyanını hesaplarsanız, Bükülmüş olanların en eski olduğunu, ardından Gevent ve Tornado'nun en taze olduğunu göreceksiniz. Ayrıca Tornado'da Twisted için yazılmış kodu çalıştırmanızatornado.platform.twisted izin veren modül var .

özet

Tornado ile Twisted'dan bir kod kullanabilirsiniz. Sadece kodunuzu büken siklon kullanmaya gerek yoktur (kodunuz daha dağınık hale gelir).

2014'e gelince, Tornado hem python2 hem de python3 üzerinde çalışan yaygın olarak kabul edilen ve varsayılan async çerçevesi olarak kabul edilir. Ayrıca son sürüm 4.x, https://docs.python.org/dev/library/asyncio.html adresinden çok sayıda işlevsellik getiriyor .

Tornado işlevselliği hakkında çok daha fazla yazdığım en iyi Python web çerçevesi olan Tornado'yu neden düşündüğümü açıklayan bir makale yazdım.


15

( GÜNCELLEME : Ne kadar az cevabın Gevent'i önerdiğine ya da bahsettiğine üzüldüm - bunun bu mükemmel kütüphanenin popülaritesi, performansı ve kullanım kolaylığıyla orantılı olduğunu düşünmüyorum!)

Aksine ilk başta bariz görünse de Gevent ve Twisted birbirlerini dışlamazlar. geventreactorKişinin her iki dünyanın en iyisini nispeten sorunsuz bir şekilde kullanmasına izin veren bir proje var :

  • Eşzamanlılık söz konusu olduğunda programlanması çok daha kolay olan Gevent'in verimli ve ucuz (işbirlikçi yeşil) iplik modeli - açıkçası, Twisted's inlineCallbacks , birçok coroutin söz konusu olduğunda performans açısından işe yaramıyor ve kullanım kolaylığı / şeffaflığı: yieldve Deferredsher yerde; bazı soyutlamalar yapmak genellikle zordur; dehşet verici yararsız yığın izleri hem çıplak Deferreds hem de, ve daha fazlası ile @inlineCallbacks.
  • Twisted'ın dahil ancak bunlarla sınırlı olmamak üzere tüm yerleşik işlevleri IReactorProcess.spawnProcess.

Şahsen şu anda Twisted 12.3 ile köprülenmiş Gevent 1.0rc2 kullanıyorum geventreactor. geventreactorUmarım yakında yayınlayacağım kendi henüz yayınlanmamış eklemelerimi ve geliştirmelerimi yaptım.geventreactor orijinal GitHub veri havuzunun bir : https://github.com/jyio/geventreactor .

Mevcut düzenim Gevent'in güzel programlama modelinde programlamama ve engellememe gibi şeylerden yararlanmama izin veriyor socket , urllib2ve diğer modüllerin. Öğrenme eğrisinin ve basit, basit şeyleri Twisted yolu yapmanın zorluğunun aksine, düzenli şeyler yapmak için normal Python kodunu kullanabilirim. Ayrıca normalde Twisted ile söz konusu olan veya iş parçacığı kullanımını gerektiren çoğu 3. taraf kitaplığını da kullanabilirim.

Ayrıca, (yeşil yerine) kullanarak garip ve genellikle aşırı karmaşık geri arama tabanlı programlamayı tamamen önleyebilirim Deferred s ve geri aramalar ve / veya@inlineCallbacks .

(Bu cevap, Twisted ve Gevent'i gerçek hayat projelerinde kullandığım kişisel deneyimlerime dayanarak yazılmıştır, Twisted'ı kullanmada önemli ölçüde daha fazla deneyime sahiptir (ancak Twisted uzmanı olduğunu iddia etmiyorum). Twisted'ın birçok özelliğini kullanmak zorunda değildi, bu yüzden Twisted'a ihtiyaç duyduğunuz özellik setine bağlı olarak, Gevent ve Twisted'ı karıştırmanın (nispeten ağrısız) ekstra karmaşıklığı belaya değmeyebilir.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.