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).