Kapan menggunakan Tornado, kapan menggunakan Twisted / Cyclone / GEvent / lainnya [ditutup]

181

Kerangka kerja / perpustakaan mana yang akan menjadi pilihan terbaik untuk membangun aplikasi web multiuser modern? Saya ingin memiliki server web yang tidak sinkron yang memungkinkan saya untuk mengukur dengan mudah. Solusi apa yang akan memberikan kinerja terbaik / skalabilitas / kerangka kerja paling berguna (dalam hal mudah digunakan dan mudah dikembangkan)?

Akan sangat bagus jika itu akan memberikan fungsionalitas yang baik (soket web, rpc, streaming, dll).

Apa pro dan kontra dari setiap solusi?

Wojciech Danilo
sumber
Apakah itu perlu menjadi salah satu kerangka kerja ini? Apa rencanamu untuk dilakukan dan dapatkah sesuatu seperti Django, Pylons, dll ... berfungsi?
Joe Doherty
Tidak, tentu saja tidak, tapi saya akan senang jika itu tidak sinkron dan akan memiliki dukungan yang baik untuk soket web - Saya telah memperbarui pertanyaannya juga. Terima kasih.
Wojciech Danilo
3
Semacam pertanyaan luas, bukan?
Jean-Paul Calderone
Pilihan Anda tergantung pada perpustakaan, yang ingin Anda gunakan. Pustaka Anda - pada tugas, yang ingin Anda selesaikan.
Nikolay Fominyh
1
Ya itu luas, tetapi mungkin dapat dilepas. Saya bertanya-tanya apakah perpustakaan ini digunakan dalam produksi dan seseorang, yang menggunakan beberapa dari mereka setiap hari dapat mengetahui apa yang bagus untuk mereka, apa kekurangannya dll. Apa yang seharusnya menjadi dasar untuk memilih perpustakaan - mungkin Twisted harus Dianggap depresiasi ketika berbicara tentang Autobahn atau Topan? Atau mmaybe Autobahn dan Cyclone belum siap produksi dan pemeliharaannya masih dipertanyakan? Atau mungkin Tornado memiliki desain yang lebih modern dan masa depan mungkin akan bersinar dan hebat dan itu harus menjadi pilihan untuk proyek startup?
Wojciech Danilo

Jawaban:

226

" Django adalah kerangka kerja Python Web tingkat tinggi yang mendorong pengembangan cepat dan desain pragmatis yang bersih" . Jika Anda sedang membangun sesuatu yang mirip dengan situs e-commerce, maka Anda mungkin harus pergi dengan Django. Ini akan menyelesaikan pekerjaan Anda dengan cepat. Anda tidak perlu khawatir tentang terlalu banyak pilihan teknologi. Ini memberikan semua hal yang Anda butuhkan dari mesin template ke ORM. Akan ada sedikit pendapat tentang cara Anda menyusun aplikasi, yang bagus Jika Anda bertanya kepada saya. Dan itu memiliki komunitas terkuat dari semua perpustakaan lain, yang berarti bantuan mudah tersedia.

" Flask adalah mikro untuk Python berdasarkan Werkzeug, Jinja 2 dan niat baik" . Waspadalah - "mikroframework" mungkin menyesatkan. Ini tidak berarti bahwa Flask adalah perpustakaan yang setengah matang. Ini berarti inti labu sangat, sangat sederhana. Tidak seperti Django, Itu tidak akan membuat keputusan Teknologi untuk Anda. Anda bebas memilih mesin template atau ORM apa pun yang Anda sukai. Meskipun dilengkapi dengan mesin template Jinja secara default, Anda selalu bebas memilih sendiri. Sejauh yang saya tahu Flask berguna untuk menulis titik akhir API (layanan tenang).

" Twisted adalah mesin jaringan yang dikendalikan oleh peristiwa yang ditulis dengan python" . Ini adalah mesin performa tinggi. Alasan utama kecepatannya adalah sesuatu yang disebut ditangguhkan. Twisted dibangun di atas tangguhan. Bagi Anda yang tidak tahu tentang ditunda, itu adalah mekanisme melalui arsitektur asinkron tercapai. Memutar sangat cepat. Tetapi tidak cocok untuk menulis webapps konvensional. Jika Anda ingin melakukan hal-hal jaringan tingkat rendah, twisted adalah teman Anda.

" Tornado adalah kerangka kerja web Python dan pustaka jaringan asinkron, yang awalnya dikembangkan di FriendFeed. Dengan menggunakan jaringan non-pemblokiran I / O, Tornado dapat menskalakan hingga puluhan ribu koneksi terbuka, menjadikannya ideal untuk pemungutan suara panjang, WebSockets, dan aplikasi lainnya yang membutuhkan koneksi berumur panjang untuk setiap pengguna " . Tornado berdiri di suatu tempat antara Django dan Flask. Jika Anda ingin menulis sesuatu dengan Django atau Flask, tetapi jika Anda membutuhkan kinerja yang lebih baik, Anda dapat memilih Tornado. itu dapat menangani masalah C10k dengan sangat baik jika dirancang dengan benar.

" Cyclone adalah kerangka kerja server web untuk Python yang mengimplementasikan Tornado API sebagai protokol Twisted" . Sekarang, bagaimana jika Anda menginginkan sesuatu yang hampir sama berkinerja seperti Twisted tetapi mudah untuk menulis webapp konvensional? Katakan halo kepada topan. Saya lebih suka Topan daripada Tornado. Ini memiliki API yang sangat mirip dengan Tornado. Sebenarnya, ini adalah garpu Tornado. Tapi masalahnya adalah komunitasnya relatif kecil. Alexandre Fiori adalah satu-satunya pengawas utama untuk repo tersebut.

" Pyramid adalah kerangka kerja pengembangan aplikasi web Python yang umum dan open source. Tujuan utamanya adalah untuk membuatnya lebih mudah bagi pengembang Python untuk membuat aplikasi web." Saya belum benar-benar menggunakan Piramida, tetapi saya membaca dokumentasi. Dari apa yang saya mengerti, Piramida sangat mirip dengan Flask dan saya pikir Anda dapat menggunakan Piramida di mana pun Flask tampaknya tepat dan sebaliknya.

SUNTING : Permintaan untuk meninjau kerangka kerja lain disambut!

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

dhilipsiva
sumber
1
Django adalah kerangka kerja pilihan saya. Dokumentasinya sangat bagus dan ORM mudah. Selatan sangat bagus untuk migrasi skema basis data .... Tetapi pertanyaannya adalah: "Saya ingin memiliki server web yang tidak sinkron yang akan memungkinkan saya untuk mengukur dengan mudah." Django dibuat untuk situs respons + permintaan klasik, bukan untuk async.
guettli
1
Bisakah Anda menulis tentang Piramida?
Fizer Khan
5
@FizerKhan: Sesuai permintaan Anda, saya memperbarui jawabannya. Maaf butuh waktu lama. Tidak punya waktu untuk menggunakan Piramida. Tetapi saya membaca dokumentasi.
dhilipsiva
1
Saya akan menambahkan bahwa lingkungan berulir tunggal yang digunakan Tornado jauh lebih rentan terhadap bug - kesalahan yang membuat kode untuk satu titik akhir API lebih lambat akan dengan mudah menyebabkan masalah untuk semua titik akhir.
Abel Molina
1
Bisakah Anda berkomentar tentang cherrypy?
Stavros Avramidis
60

Ini jelas merupakan jawaban yang agak bias , tetapi itu tidak sama dengan jawaban yang salah ; Anda harus selalu menggunakan Twisted. Saya telah menjawab pertanyaan serupa sebelumnya, tetapi karena pertanyaan Anda tidak persis sama, berikut adalah beberapa alasan:

"Performa terbaik"

Twisted terus memantau kinerja kami di situs web speed.twistedmatrix.com . Kami juga salah satu proyek pertama yang dipantau oleh situs serupa PyPy , dengan demikian memastikan kinerja Twisted yang baik pada runtime yang ada yang peduli dengan aplikasi berkinerja tinggi di Python.

"Skalabilitas"

Sepengetahuan saya, tidak ada kerangka kerja yang terdaftar yang memiliki dukungan bawaan untuk penskalaan otomatis; semuanya adalah kerangka komunikasi, jadi Anda harus melakukan pekerjaan untuk berkomunikasi di antara titik skala Anda. Namun, Twisted memiliki keunggulan dalam dukungan bawaannya untuk multi-pemrosesan lokal . Dalam keadilan, ada add-on pihak ketiga untuk Tornado yang memungkinkan Anda untuk melakukan hal yang sama. Dalam rilis terbaru, Twisted telah menambahkan fitur yang meningkatkan jumlah cara Anda dapat berbagi pekerjaan di antara inti, dan pekerjaan sedang berlangsung di area itu. Bengkok juga memiliki beberapa yang terintegrasi dengan baik , "pribumi" RPC protokol yang menawarkan konstruksi-kit untuk idiom skala apa pun yang Anda ingin mengejar.

"Sangat berguna"

Banyak orang yang menganggap Twisted sangat berguna . Sedemikian rupa sehingga banyak dari mereka telah memperpanjangnya dan membuat ekstensi mereka tersedia untuk Anda.

"Kegunaan"

Di luar kotak, Twisted mencakup:

Di departemen terakhir ini, setidaknya, Twisted tampaknya merupakan pemenang yang jelas untuk fungsionalitas bawaan. Dan semua ini, dalam satu paket lebih dari 2 megabita!

Mesin terbang
sumber
6
mengapa begitu banyak orang mengatakan bahwa mereka tidak lagi menggunakan Twisted, tetapi GEvent?
remdezx
1
Ada banyak orang yang mengatakan bahwa sulit untuk mempertahankan aplikasi besar menggunakan Twisted (karena arsitektur panggilan baliknya ): stackoverflow.com/questions/3048012/... Bukankah lebih baik menggunakan gevent atau Twisted berbasis gevent?
Wojciech Danilo
8
@remdezx Untuk pertanyaan Anda, ada dua alasan. Salah satunya adalah bahwa orang menemukan Twisted sulit untuk dipahami karena pemrograman bersamaan sulit untuk dipahami. Mereka kemudian beralih ke GEvent karena itu mudah dipahami secara dangkal - selama tidak ada konkurensi, semuanya berfungsi seperti yang Anda harapkan. Alasan lainnya adalah bahwa jauh lebih sedikit pekerjaan untuk memindahkan kode ke GEvent yang tidak ditulis menggunakan API yang digerakkan oleh peristiwa untuk mendapatkan manfaat kinerja dari I / O yang digerakkan oleh peristiwa. Jika kode Anda tidak berbagi terlalu banyak status, port seperti itu mungkin berfungsi dengan baik.
Glyph
1
@ Glyph, Anda berbicara tentang konkurensi, tetapi ... tidak ada konkurensi dukungan Gevent atau Twisted (tentu saja Anda dapat menggunakan multiprosesing dengan gevent dan menggunakan kumpulan thread nyata dan kumpulan greenlet pada setiap thread - yang berfungsi baik untuk saya dan Anda dapat menggunakan plugin Twisted untuk melakukan hal yang persis sama - jalankan multiple twisted intances di sebelah satu sama lain) Tetapi apakah Twisted memberi Anda sesuatu yang lebih dari gevent? Saya pikir bahkan dengan beberapa contoh gevent / twisted, gevent lebih mudah untuk dipahami dan tanpa panggilan balik eksplisit io. Apakah saya melewatkan sesuatu?
Wojciech Danilo
2
@ danilo2 Ya, Anda kehilangan setidaknya satu hal :). Khususnya Anda salah memahami kata "concurrency" yang berarti "eksekusi paralel bersamaan pada banyak CPU". Twisted dapat melakukan penjadwalan I / O secara bersamaan melalui asynchronous (berbasis callback) I / O. GEvent dapat melakukan penjadwalan I / O bersamaan melalui penjadwal thread mikro. Di Twisted, menggunakan spawnProcess, penjadwalan I / O ini dapat diterjemahkan ke dalam penjadwalan CPU juga.
Glyph
48

Saya suka respons @Glyph. Twisted sangat komprehensif, kerangka python kaya. Twisted dan Tornado memiliki desain yang sangat mirip. Dan saya sangat menyukai desain ini:

  • itu cepat
  • mudah dimengerti
  • mudah diperpanjang
  • tidak membutuhkan ekstensi-c
  • bekerja pada PyPy.

Tapi saya ingin menyoroti Tornado , yang saya sukai dan baru-baru ini mendapatkan popularitas. Tornado, seperti Twisted, menggunakan pemrograman gaya panggilan balik, tetapi dapat digarisbawahi menggunakan tornado.gen.engine( twisted.internet.inlineCallbacksdalam Twisted).

Basis kode

Komentar terbaik adalah dari situs http://cyclone.io . cyclone mencoba mencampur Twisted dan Tornado karena:

Twisted adalah salah satu perpustakaan paling dewasa untuk I / O non-pemblokiran yang tersedia untuk umum. Tornado adalah versi open source dari server web FriendFeed, salah satu server web paling populer dan cepat untuk Python, dengan API yang sangat baik untuk membangun aplikasi web.

Idenya adalah untuk menjembatani API Tornado yang elegan dan langsung ke Twisted's Event-Loop, memungkinkan sejumlah besar protokol yang didukung.

Tetapi pada 2011 tornado.platform.twistedkeluar yang membawa fungsionalitas serupa.

Performa

Tornado memiliki kinerja yang jauh lebih baik . Ini juga berfungsi mulus dengan PyPy, dan mendapatkan keuntungan besar.

Skalabilitas

Sama seperti Twisted. Tornado telah tornado.processdan banyak layanan rpc diimplementasikan di atasnya.

Kegunaan

Ada 71 paket berbasis Tornado, dibandingkan dengan 148 Twisted dan 48 Gevent. Tetapi jika Anda melihat dengan cermat dan menghitung median waktu unggah paket, Anda akan melihat bahwa Twisted adalah yang tertua, lalu Gevent dan Tornado yang paling baru. Selain itu ada tornado.platform.twistedmodul yang memungkinkan Anda untuk menjalankan kode yang ditulis untuk Twisted on Tornado .

Ringkasan

Dengan Tornado Anda dapat menggunakan kode dari Twisted. Tidak perlu menggunakan topan yang hanya memutar kode Anda (kode Anda menjadi lebih berantakan).

Sedangkan untuk 2014, Tornado dianggap sebagai kerangka kerja async yang diterima secara luas dan standar yang berfungsi baik pada python2 dan python3. Juga versi terbaru 4.x menghadirkan banyak fungsionalitas dari https://docs.python.org/dev/library/asyncio.html .

Saya menulis sebuah artikel, menjelaskan mengapa saya menganggap bahwa Tornado - kerangka kerja web Python terbaik di mana saya menulis lebih banyak tentang fungsi Tornado.

Robert Zaremba
sumber
15

( PEMBARUAN : Saya sangat terkejut tentang betapa sedikit jawaban di sini yang merekomendasikan atau bahkan menyebut Gevent — saya pikir itu tidak sebanding dengan popularitas, kinerja, dan kemudahan penggunaan perpustakaan yang luar biasa ini!)

Gevent dan Twisted tidak saling eksklusif, meskipun sebaliknya mungkin tampak jelas pada awalnya. Ada sebuah proyek yang disebut geventreactoryang memungkinkan seseorang untuk secara relatif lancar memanfaatkan yang terbaik dari kedua dunia, yaitu:

  • Model benang Gevent yang efisien dan murah (kooperatif), yang jauh lebih mudah untuk diprogram dalam hal konkurensi — sejujurnya, Twisted's inlineCallbackstidak sanggup melakukan pekerjaan dalam hal kinerja ketika menyangkut banyak coroutine, dan tidak juga di ketentuan kemudahan / transparansi penggunaan: yielddan di Deferredsmana - mana; seringkali sulit untuk membangun beberapa abstraksi; jejak tumpukan yang sangat tidak berguna dengan telanjang Deferreddan juga, dan bahkan lebih lagi dengan @inlineCallbacks.
  • Semua fungsi bawaan Twisted yang pernah Anda impikan, termasuk tetapi tidak terbatas pada IReactorProcess.spawnProcess.

Saya pribadi saat ini menggunakan Gevent 1.0rc2 dengan Twisted 12.3 yang dijembatani oleh geventreactor. Saya telah mengimplementasikan penambahan dan penyempurnaan geventreactorsaya yang belum dipublikasikan yang akan segera saya publikasikan, semoga sebagai bagian dari geventreactorrepositori GitHub asli: https://github.com/jyio/geventreactor .

Tata letak saya saat ini memungkinkan saya untuk memprogram dalam model pemrograman Gevent yang bagus, dan memanfaatkan hal-hal seperti non-blocking socket, urllib2dan modul lainnya. Saya dapat menggunakan kode Python biasa untuk melakukan hal-hal biasa, yang bertentangan dengan kurva belajar dan ketidaknyamanan melakukan hal-hal sederhana, dasar bahkan dengan cara Twisted. Saya juga dapat dengan mudah menggunakan sebagian besar perpustakaan pihak ke-3 yang biasanya tidak dipertanyakan dengan Twisted, atau membutuhkan penggunaan utas.

Saya juga dapat sepenuhnya menghindari pemrograman berbasis callback yang canggung dan seringkali terlalu rumit dengan menggunakan greenlets (bukan Deferreds dan callback, dan / atau @inlineCallbacks).

(Jawaban ini ditulis berdasarkan pengalaman pribadi saya menggunakan Twisted dan Gevent dalam proyek-proyek kehidupan nyata, dengan pengalaman lebih banyak menggunakan Twisted (tapi saya tidak mengklaim sebagai ahli Twisted). Perangkat lunak yang saya harus tulis tidak harus menggunakan terlalu banyak fitur Twisted, jadi tergantung pada serangkaian fitur yang Anda butuhkan dari Twisted, kompleksitas ekstra (relatif tidak menyakitkan) dari pencampuran Gevent dan Twisted mungkin tidak sebanding dengan masalahnya.)

Erik Kaplun
sumber