A (uzun) süre önce, eşzamanlı isteklerin aynı anda gerçekleşmesini sağlamak için birden çok iş parçacığına sahip olduğum bir web-örümcek yazdım. Bu benim Python gençliğimde, GIL ve çok iş parçacıklı kod için oluşturduğu ilişkili sıkıntıları bilmeden önceki günlerde (IE, çoğu zaman sadece seri hale geliyor!) ...
Daha sağlam hale getirmek ve daha iyi performans göstermek için bu kodu yeniden çalışmak istiyorum. Bunu yapmanın temel olarak iki yolu var: Yeni çoklu işlem modülünü 2.6+ sürümünde kullanabilirim veya bir çeşit reaktör / olaya dayalı bir model için gidebilirim. Çok daha basit ve daha az hata eğilimli olduğu için daha sonra yapmayı tercih ederim.
Dolayısıyla soru, ihtiyaçlarıma en uygun çerçeveyle ilgilidir. Aşağıda şimdiye kadar bildiğim seçeneklerin bir listesi:
- Twisted : Python reaktör çerçevelerinin büyükbabası: ancak karmaşık ve biraz şişkin görünüyor. Küçük bir görev için dik öğrenme eğrisi.
- Eventlet : Lindenlab'daki adamlardan . Bu tür görevlere yönelik, Greenlet tabanlı çerçeve. Yine de koda bir göz vardı ve çok güzel değil: pep8 uyumlu, baskılar ile dağınık (neden insanlar bunu bir çerçeve içinde yapıyor !?), API biraz tutarsız görünüyor.
- PyEv : Olgunlaşmamış, şu anda onu kullanan biri gibi görünmüyor, ancak libevente dayanıyor, bu yüzden sağlam bir arka uca sahip.
- asyncore : stdlib'den : über düşük seviyeli, sadece yerden bir şey almak için bir sürü ayak işi gibi görünüyor.
- tornado : Bu, dinamik web sitelerini sunucuya sunmak için tasarlanmış sunucu odaklı bir ürün olmasına rağmen, zaman uyumsuz bir HTTP istemcisi ve basit bir ioloop içerir . Görünüţe göre iţi halledebiliyordu ama amacýna göre deđil. [edit: ne yazık ki Windows'ta çalışmıyor, bu benim için önemli - bu topal platformu desteklemek benim için bir gereklilik]
Kaçırdığım bir şey var mı? Şüphesiz, basitleştirilmiş bir zaman uyumsuz ağ iletişim kütüphanesinin en güzel yerine uyan bir kütüphane olmalı!
[edit: bu sayfaya gösterdiği işaret için intgr'a çok teşekkürler . En alta kaydırırsanız, bu görevi bir şekilde ele almayı amaçlayan gerçekten güzel bir proje listesi göreceksiniz. Görünüşe göre Twisted'ın başlangıcından bu yana işler gerçekten devam ediyor: insanlar artık geleneksel bir reaktör / geri çağrı odaklı olandan ziyade ko-rutin tabanlı bir çözümü destekliyor gibi görünüyor . Bu yaklaşımın faydaları daha açık ve doğrudan kodlardır: Kesinlikle geçmişte buldum, özellikle boost.asio ile çalışırkenC ++ 'da geri arama tabanlı kod, takip edilmesi zor olabilecek ve eğitimsiz göz için nispeten belirsiz olan tasarımlara yol açabilir. Ko-rutinleri kullanmak, en azından biraz daha senkronize görünen bir kod yazmanıza izin verir. Sanırım şimdi görevim, bu kütüphanelerden hangisinin görünümünü sevdiğimi bulmak ve bir şans vermek! Sevindim şimdi sordum ...]
[değiştir: belki de bu soruyu takip eden veya tökezleyen veya herhangi bir anlamda bu konuyla ilgilenen herkes için ilgi çekici: Bu iş için mevcut araçların mevcut durumunun gerçekten harika bir yazısını buldum ]
select
G / Ç çoğullama için kullandığı için performans ve ölçeklenebilir değil . Ancak kasırga-pyuv ile iyi bir performans elde edebilmelisiniz . 2. Artık Python 3.3+ ve onun backport trollius'unda olay döngüsünde herhangi bir Tornado uygulamasını çalıştırmaya izin veren asyncio var (Twisted yakında desteklenecek).