"Çocuk süreçler, programda daha önce oluşturulan nesneleri paylaşıyor mu?"
Hayır (3.8'den önce python) ve 3.8'de Evet ( https://docs.python.org/3/library/multiprocessing.shared_memory.html#module-multiprocessing.shared_memory )
İşlemlerin bağımsız bellek alanı vardır.
1.Çözüm
Çok sayıda işçi bulunan büyük bir yapıyı en iyi şekilde kullanmak için bunu yapın.
Her çalışanı bir "filtre" olarak yazın - stdin'den ara sonuçları okur, çalışır, ara sonuçları stdout'a yazar.
Tüm çalışanları bir boru hattı olarak bağlayın:
process1 <source | process2 | process3 | ... | processn >result
Her süreç okur, çalışır ve yazar.
Bu, tüm süreçler aynı anda çalıştığı için oldukça verimlidir. Yazma ve okuma işlemleri, işlemler arasındaki paylaşılan tamponlardan doğrudan geçer.
2.Çözüm
Bazı durumlarda, daha karmaşık bir yapıya sahipsiniz - genellikle bir "yayılma" yapısı. Bu durumda birden fazla çocuğu olan bir ebeveyniniz vardır.
Üst öğe, kaynak verileri açar. Ebeveyn birkaç çocuğu çatallar.
Ebeveyn kaynağı okur, kaynağın parçalarını eşzamanlı olarak çalışan her çocuğa dağıtır.
Ebeveyn sona ulaştığında boruyu kapatın. Çocuk dosyanın sonuna gelir ve normal şekilde bitirir.
Çocuk bölümleri yazmak hoş çünkü her çocuk basitçe okuyor sys.stdin
.
Ebeveynin, tüm çocukları yumurtlama ve boruları düzgün bir şekilde tutma konusunda biraz süslü ayak çalışması var, ama bu çok da kötü değil.
Fan-in zıt yapıdır. Bağımsız olarak çalışan bir dizi işlemin girdilerini ortak bir sürece eklemesi gerekir. Koleksiyoncu, birçok kaynaktan okumak zorunda olduğu için yazmak o kadar kolay değildir.
Birçok adlandırılmış kanaldan okuma, select
hangi kanalların bekleyen girdiye sahip olduğunu görmek için genellikle modül kullanılarak yapılır .
3. Çözüm
Paylaşılan arama, bir veritabanının tanımıdır.
Çözüm 3A - bir veritabanı yükleyin. Çalışanların veri tabanındaki verileri işlemesine izin verin.
Çözüm 3B - çalışanların sunucuyu sorgulayabilmesi için HTTP GET'e yanıt veren WSGI uygulamaları sağlamak için werkzeug (veya benzerini) kullanarak çok basit bir sunucu oluşturun .
4.Çözüm
Paylaşılan dosya sistemi nesnesi. Unix OS, paylaşılan bellek nesneleri sunar. Bunlar yalnızca belleğe eşlenen dosyalardır, böylece daha fazla arabelleğe alınmış okuma yerine G / Ç değiştirilir.
Bunu bir Python bağlamından birkaç şekilde yapabilirsiniz
(1) orijinal devasa nesnenizi daha küçük nesnelere bölen ve (2) her biri daha küçük bir nesneyle çalışanları başlatan bir başlangıç programı yazın. Küçük nesneler, küçük bir dosya okuma süresinden tasarruf etmek için Python nesneleriyle temizlenebilir.
(1) orijinal devasa nesnenizi okuyan ve seek
tek tek bölümlerin basit aramalarla kolayca bulunmasını sağlamak için işlemleri kullanarak sayfa yapılı, bayt kodlu bir dosya yazan bir başlangıç programı yazın . Bir veritabanı motorunun yaptığı şey budur - verileri sayfalara böler, her sayfanın bir seek
.
Bu büyük sayfa yapılı dosyaya erişen işçiler oluşturun. Her işçi ilgili bölümleri arayabilir ve orada işini yapabilir.
marshal.load
şekliyle ebeveyn ve her çocuk için gerekli olacaktır (her işlem modülü içe aktarır).