Beberapa waktu yang lalu saya menulis web-spider yang saya multithreaded untuk memungkinkan permintaan bersamaan terjadi pada saat yang sama. Itu di masa muda Python saya, pada hari-hari sebelum saya tahu tentang GIL dan kesengsaraan terkait yang dibuatnya untuk kode multithreaded (IE, sebagian besar waktu hanya berakhir serial!) ...
Saya ingin mengerjakan ulang kode ini agar lebih kuat dan berkinerja lebih baik. Pada dasarnya ada dua cara saya bisa melakukan ini: Saya bisa menggunakan modul multiprosesor baru di 2.6+ atau saya bisa menggunakan model semacam reaktor / event-based. Saya lebih suka melakukannya nanti karena itu jauh lebih sederhana dan lebih rentan kesalahan.
Jadi pertanyaannya terkait dengan kerangka kerja apa yang paling cocok dengan kebutuhan saya. Berikut ini adalah daftar opsi yang saya ketahui sejauh ini:
- Twisted : Nenek dari kerangka kerja reaktor Python: tampaknya rumit dan sedikit membengkak. Curam kurva belajar untuk tugas kecil.
- Eventlet : Dari orang-orang di lindenlab . Kerangka kerja berbasis Greenlet yang diarahkan pada tugas-tugas semacam ini. Saya telah melihat kode meskipun dan itu tidak terlalu cantik: non-pep8 compliant, tersebar dengan cetakan (mengapa orang melakukan ini dalam suatu kerangka kerja !?), API tampaknya sedikit tidak konsisten.
- PyEv : Belum dewasa, sepertinya tidak ada orang yang menggunakannya sekarang meskipun didasarkan pada libevent sehingga punya backend yang solid.
- asyncore : Dari stdlib: über level rendah, sepertinya banyak kerja keras yang terlibat hanya untuk mendapatkan sesuatu dari tanah.
- tornado : Meskipun ini adalah produk berorientasi server yang dirancang untuk server situs web dinamis, ia menampilkan klien HTTP async dan ioloop sederhana . Sepertinya itu bisa menyelesaikan pekerjaan tetapi tidak untuk apa itu dimaksudkan. [edit: sayangnya tidak berjalan di Windows, yang penting bagi saya - ini merupakan persyaratan bagi saya untuk mendukung platform lumpuh ini]
Apakah ada sesuatu yang saya lewatkan? Tentunya harus ada perpustakaan di luar sana yang cocok dengan sweet-spot perpustakaan jaringan async yang disederhanakan!
[edit: terima kasih banyak kepada intgr untuk penunjuknya ke halaman ini . Jika Anda menggulir ke bawah Anda akan melihat ada daftar proyek yang sangat bagus yang bertujuan untuk menangani tugas ini dengan satu atau lain cara. Tampaknya sebenarnya hal-hal telah benar-benar bergerak sejak dimulainya Twisted: orang sekarang tampaknya lebih menyukai solusi berbasis rutinitas daripada yang berorientasi pada reaktor / panggilan balik tradisional. Manfaat dari pendekatan ini adalah kode yang lebih jelas: saya pasti pernah menemukan di masa lalu, terutama ketika bekerja dengan boost.asiodalam C ++ bahwa kode berbasis panggilan balik dapat menyebabkan desain yang sulit diikuti dan relatif tidak jelas bagi mata yang tidak terlatih. Menggunakan co-rutin memungkinkan Anda untuk menulis kode yang terlihat sedikit lebih sinkron. Saya kira sekarang tugas saya adalah menentukan salah satu dari sekian banyak perpustakaan yang saya suka tampilan dan mencobanya! Senang saya bertanya sekarang ...]
[sunting: mungkin menarik bagi siapa saja yang mengikuti atau menemukan masalah ini atau peduli dengan topik ini dalam arti apa pun: Saya menemukan artikel yang sangat bagus tentang kondisi terkini dari alat yang tersedia untuk pekerjaan ini]
select
untuk I / O multiplexing. Tetapi Anda harus bisa mendapatkan kinerja yang layak dengan tornado-pyuv . 2. Sekarang ada asyncio di Python 3.3+ dan trollius backport- nya yang memungkinkan untuk menjalankan aplikasi Tornado apa pun di loop acara (Twisted akan segera didukung).Jawaban:
Saya menyukai modul Python concurrence yang bergantung pada microthreads Python Stackless atau Greenlets untuk threading ringan. Semua I / O jaringan pemblokiran secara transparan dibuat asinkron melalui satu
libevent
loop, sehingga harus hampir seefisien server asinkron yang sebenarnya.Saya kira ini mirip dengan Eventlet dengan cara ini.
Kelemahannya adalah API-nya sangat berbeda dengan Python
sockets
/threading
modul; Anda perlu menulis ulang sedikit aplikasi Anda (atau menulis lapisan shim kompatibilitas)Sunting: Tampaknya ada juga cogen , yang serupa, tetapi menggunakan generator Python 2.5 yang disempurnakan untuk coroutine-nya, bukan Greenlets. Ini membuatnya lebih portabel daripada persetujuan dan alternatif lainnya. Jaringan I / O dilakukan secara langsung dengan epoll / kqueue / iocp.
sumber
Twisted itu rumit, Anda benar tentang itu. Twisted tidak kembung.
Jika Anda melihat di sini: http://twistedmatrix.com/trac/browser/trunk/twisted Anda akan menemukan paket terorganisir, komprehensif, dan sangat teruji dari banyak protokol internet, serta kode pembantu untuk menulis dan menyebarkan aplikasi jaringan yang sangat canggih. Saya tidak akan bingung mengasapi dengan kelengkapan.
Sudah diketahui umum bahwa dokumentasi Twisted bukan yang paling ramah pengguna dari pandangan pertama, dan saya percaya ini memalingkan banyak orang. Tapi Twisted luar biasa (IMHO) jika Anda memasukkan waktu. Saya lakukan dan terbukti sepadan, dan saya akan merekomendasikan kepada orang lain untuk mencoba yang sama.
sumber
gevent adalah eventlet dibersihkan .
API-bijaksana mengikuti konvensi yang sama seperti perpustakaan standar (khususnya, modul threading dan multiprocessing) di mana masuk akal. Jadi, Anda memiliki hal-hal yang akrab seperti Antrian dan Acara untuk dikerjakan.
Ini hanya mendukung libevent ( pembaruan: libev sejak 1.0 ) sebagai implementasi reaktor tetapi mengambil keuntungan penuh darinya, menampilkan server WSGI cepat berdasarkan libevent-http dan menyelesaikan permintaan DNS melalui libevent-dns sebagai ganti menggunakan kumpulan benang seperti kebanyakan perpustakaan lainnya melakukan. ( pembaruan: karena 1.0 c-ares digunakan untuk membuat permintaan DNS async; threadpool juga merupakan pilihan.)
Seperti eventlet, itu membuat panggilan balik dan tangguhan tidak perlu dengan menggunakan greenlets .
Lihatlah contoh-contohnya: unduhan bersamaan dari beberapa url , webchat polling panjang .
sumber
Sebuah perbandingan yang sangat menarik dari kerangka kerja tersebut disusun oleh Nicholas Piël di blog-nya: layak dibaca!
sumber
Tak satu pun dari solusi ini akan menghindari fakta bahwa GIL mencegah paralelisme CPU - mereka hanya cara yang lebih baik untuk mendapatkan paralelisme IO yang sudah Anda miliki dengan utas. Jika Anda pikir Anda bisa melakukan IO yang lebih baik, tentu saja lakukan salah satunya, tetapi jika hambatan Anda dalam memproses hasilnya, tidak ada yang akan membantu di sini kecuali untuk modul multiprosesing.
sumber
Saya tidak akan menyebut Twisted bengkak, tetapi sulit untuk membungkus kepala Anda. Saya menghindari benar-benar menyelesaikan belajar cukup lama karena saya selalu menginginkan sesuatu yang sedikit lebih mudah untuk 'tugas-tugas kecil'.
Namun, sekarang saya telah bekerja dengannya lagi saya harus mengatakan memiliki semua baterai sudah SANGAT bagus.
Semua pustaka async lain yang telah saya kerjakan akhirnya jauh kurang matang daripada yang muncul. Loop acara Twisted solid.
Saya tidak yakin bagaimana cara menyelesaikan kurva pembelajaran Twisted yang curam. Mungkin membantu jika seseorang akan membayarnya dan membersihkan beberapa hal, seperti menghapus semua kesalahan kompatibilitas mundur dan proyek mati. Tapi kurasa itulah sifat dari perangkat lunak yang matang.
sumber
PortableGtkReactor
?Kamaelia belum disebutkan. Model konkurensi didasarkan pada komponen kabel bersama dengan pesan yang lewat di antara kotak masuk dan kotak keluar. Berikut ini gambaran singkatnya.
sumber
Saya sudah mulai menggunakan twisted untuk beberapa hal. Keindahannya hampir karena ia "kembung." Ada konektor untuk hampir semua protokol utama di luar sana. Anda dapat memiliki bot jabber yang akan mengambil perintah dan memposting ke server irc, mengirim email kepada seseorang, menjalankan perintah, membaca dari server NNTP, dan memantau halaman web untuk perubahan. Berita buruknya adalah ia dapat melakukan semua itu dan dapat membuat hal-hal yang terlalu rumit untuk tugas-tugas sederhana seperti yang dijelaskan OP. Keuntungan dari python adalah Anda hanya memasukkan apa yang Anda butuhkan. Jadi, sementara unduhannya mungkin 20mb, Anda hanya dapat memasukkan 2mb perpustakaan (yang masih banyak). Keluhan terbesar saya dengan twisted adalah meskipun mereka menyertakan contoh, apa pun di luar server tcp dasar yang Anda miliki sendiri.
Meskipun bukan solusi python, saya telah melihat node.js mendapatkan traksi lebih banyak akhir-akhir ini. Sebenarnya saya sudah mempertimbangkan untuk mencari proyek yang lebih kecil tapi saya merasa ngeri ketika mendengar javascript :)
sumber
Ada buku bagus tentang masalah ini: "Twisted Network Programming Essentials", oleh Abe Fettig. Contoh-contoh menunjukkan bagaimana menulis kode yang sangat Pythonic, dan bagi saya pribadi, jangan menganggap saya berdasarkan pada kerangka yang membengkak. Lihatlah solusi dalam buku ini, jika tidak bersih, maka saya tidak tahu apa artinya bersih.
Satu-satunya teka-teki saya adalah sama dengan yang saya miliki dengan kerangka kerja lain, seperti Ruby. Saya khawatir, apakah itu meningkat? Saya akan benci untuk melakukan klien untuk kerangka kerja yang akan memiliki masalah skalabilitas.
sumber
Whizzer adalah kerangka soket asinkron kecil yang menggunakan pyev. Sangat cepat, terutama karena pyev. Ia mencoba untuk menyediakan antarmuka yang sama seperti memutar dengan beberapa perubahan kecil.
sumber
Coba juga Syncless . Ini berbasis coroutine (jadi mirip dengan Concurrence, Eventlet dan gevent). Ini mengimplementasikan penggantian non-pemblokiran drop-in untuk socket.socket, socket.gethostbyname (dll.), Ssl.SSLSocket, time.sleep dan select.select. Itu cepat. Perlu Stackless Python dan libevent. Ini berisi ekstensi Python wajib yang ditulis dalam C (Pyrex / Cython).
sumber
Saya Mengonfirmasi kebaikan sinkronisasi . Itu dapat menggunakan libev (libevent versi yang lebih baru, lebih bersih, dan lebih baik). Beberapa waktu yang lalu ia tidak memiliki dukungan sebanyak yang dimiliki libevent, tetapi sekarang proses pengembangannya berjalan lebih jauh dan sangat berguna.
sumber
Jika Anda hanya ingin Perpustakaan Permintaan HTTP Sederhana, ringan maka saya menemukan Unirest sangat bagus
sumber
Anda dipersilakan untuk melihat PyWorks, yang mengambil pendekatan yang sangat berbeda. Itu memungkinkan instance objek berjalan di utas mereka sendiri dan membuat panggilan fungsi ke objek itu async.
Biarkan saja sebuah kelas mewarisi dari Tugas alih-alih objek dan async, semua pemanggilan metode adalah Proxy. Nilai pengembalian (jika Anda membutuhkannya) adalah proxy Masa Depan.
PyWorks dapat ditemukan di http://bitbucket.org/raindog/pyworks
sumber