Bu sorunu çözmek için iyi bir yaklaşım, önce bir sonuç elde etmek için gerekli kodu yazmak, daha sonra uygulamayı paralelleştirmek için iş parçacığı kodunu dahil etmektir.
Mükemmel bir dünyada, bu, daha sonra işlenmek üzere sonuçlarını bir sözlüğe veya listeye aktaran 100.000 iş parçacığının aynı anda başlatılması anlamına gelir, ancak uygulamada, bu şekilde kaç paralel HTTP isteği yayınlayabileceğinizle sınırlısınız. Yerel olarak, aynı anda kaç soket açabileceğiniz, Python yorumlayıcınızın kaç yürütme iş parçasına izin vereceği konusunda sınırlarınız var. Uzaktan, tüm istekler bir veya birden fazla sunucuya karşı ise, eşzamanlı bağlantı sayısıyla sınırlı olabilirsiniz. Bu sınırlamalar, muhtemelen komut dosyasını, URL'lerin küçük bir bölümünü herhangi bir anda yok edecek şekilde yazmanızı gerektirecektir (100, bahsedilen başka bir poster gibi, muhtemelen iyi bir iş parçacığı havuzu boyutudur). başarıyla uygulayabilir).
Yukarıdaki sorunu çözmek için bu tasarım desenini takip edebilirsiniz:
- Şu anda çalışan iş parçacığı sayısına kadar yeni bir iş parçacığı başlatan bir iş parçacığı başlatın (bunları threading.active_count () aracılığıyla veya iş parçacığı nesnelerini bir veri yapısına iterek izleyebilirsiniz)> = maksimum eşzamanlı istek sayınız (100 diyelim) , sonra kısa bir zaman aşımı süresi için uyur. İşlenecek başka URL olmadığında bu iş parçacığı sonlandırılmalıdır. Böylece, iplik uyanmaya, yeni iplik başlatmaya ve bitene kadar uyumaya devam edecektir.
- İstek iş parçacıklarının sonuçlarını daha sonra almak ve çıktı almak için bazı veri yapılarında saklamasını sağlayın. Yapı Sonuçları saklamak durumunda olduğu bir
list
veya dict
CPython içinde yapabilirsiniz güvenle ekleme veya kilitleri olmadan parçacığı benzersiz öğeleri ekleme bir dosyaya yazma veya daha karmaşık çapraz iplik veri etkileşiminde gerektiriyorsa, ama sen kullanmalısınız bu durumu yolsuzluktan korumak için karşılıklı dışlama kilidi .
İplik geçirme modülünü kullanmanızı öneririm . Çalışan iş parçacıklarını başlatmak ve izlemek için kullanabilirsiniz. Python'un diş açma desteği çıplak, ancak probleminizin açıklaması, ihtiyaçlarınız için tamamen yeterli olduğunu gösteriyor.
Son olarak, Python'da yazılmış bir paralel ağ uygulamasının oldukça basit bir uygulamasını görmek istiyorsanız, ssh.py'ye bakın . Birçok SSH bağlantısını paralelleştirmek için Python iş parçacığını kullanan küçük bir kütüphane. Tasarım, iyi bir kaynak olarak bulabileceğiniz gereksinimlerinize yeterince yakın.