Sana Pool.map yaklaşımı size çok mantıklı değil belirtti biliyoruz. Harita, bir çalışma kaynağı vermenin kolay bir yoludur ve her bir öğeye uygulanabilecek bir kalburdur. Harita için func
, verilen arg üzerinde gerçek işi yapmak için herhangi bir giriş noktası olabilir.
o sizin için doğru görünmüyorsa
, bir Üretici-Tüketici deseni kullanma hakkında buraya oldukça ayrıntılı cevabı var:
https://stackoverflow.com/a/11196615/496445
Esasen, bir Kuyruk yaratmak ve n işçi sayısını başlar. Ardından sıraya ana iş parçacığından beslenir veya kuyruğu besleyen bir Üretici işlemi oluşturulur. İşçiler kuyruğundan çalışmaya devam ediyorlar ve başladığınız süreçlerin sayısından daha fazla eş zamanlı çalışma olmayacak.
Ayrıca, kuyruğa bir sınır koyma seçeneğine de sahipsiniz; böylece, üreticinin tükettiği hız ve kaynaklara da kısıtlamalar koymanız gerekiyorsa, çok fazla bekleyen iş olduğunda üreticiyi engeller.
Çağrılan iş işlevi, istediğiniz her şeyi yapabilir. Bu, bazı sistem komutlarının etrafında bir sarıcı olabilir veya python lib'inizi içe aktarabilir ve ana rutini çalıştırabilir. Orada, keyfi çalıştırılabilirlerinizi sınırlı kaynaklar altında çalıştırmak için yapılandırmaları ayarlamanıza izin veren belirli süreç yönetimi sistemleri vardır, ancak bu sadece bunu yapmak için temel bir python yaklaşımıdır.
Temel Havuz: Benim o other answer itibaren
Snippet'ler
from multiprocessing import Pool
def do_work(val):
# could instantiate some other library class,
# call out to the file system,
# or do something simple right here.
return "FOO: %s" % val
pool = Pool(4)
work = get_work_args()
results = pool.map(do_work, work)
bir süreç yöneticisi ve yapımcı kullanma
from multiprocessing import Process, Manager
import time
import itertools
def do_work(in_queue, out_list):
while True:
item = in_queue.get()
# exit signal
if item == None:
return
# fake work
time.sleep(.5)
result = item
out_list.append(result)
if __name__ == "__main__":
num_workers = 4
manager = Manager()
results = manager.list()
work = manager.Queue(num_workers)
# start for workers
pool = []
for i in xrange(num_workers):
p = Process(target=do_work, args=(work, results))
p.start()
pool.append(p)
# produce data
# this could also be started in a producer process
# instead of blocking
iters = itertools.chain(get_work_args(), (None,)*num_workers)
for item in iters:
work.put(item)
for p in pool:
p.join()
print results
[Python işlem havuzları] 'nı denediniz mi (http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool)? – C2H5OH
Bunu yapmanın en kolay yolu, "multiprocessing.pool" öğesini oluşturan ve işçinin (program.py) iş parçacığını yansıtan bir "denetleyici" programı oluşturmaktır; – jozzas
Teşekkürler, bunu deneyeceğim; ilk denememde bir nedenden dolayı multiprocessing.pool'un istediğim gibi olmadığına vardım, ama şimdi doğru görünüyor. Bu durumda, çalışan iş parçacıkları sadece program.py (alt işlemle birlikte bir iş parçacığı olarak mı? Popen) oluştururlar? Takip edebileceğim kaba bir örnek veya şablon uygulaması gönderir misiniz? – steadfast