wiem wspomniałeś, że podejście Pool.map nie ma sensu do Ciebie. Mapa jest po prostu łatwym sposobem, aby nadać jej źródło pracy i możliwość wywoływania każdego z przedmiotów. func
dla mapy może być dowolnym punktem wejścia do rzeczywistej pracy na danym arg.
Jeśli to nie wydaje się słuszne dla ciebie, mam dość szczegółową odpowiedź tutaj o użyciu wzorca Producent konsumentów: https://stackoverflow.com/a/11196615/496445
Zasadniczo utworzyć kolejkę, a zacząć N Liczba pracowników. Następnie możesz podać kolejkę z głównego wątku lub utworzyć proces Producer, który przekazuje kolejkę. Pracownicy po prostu kontynuują pracę z kolejki i nigdy nie będzie więcej równoległej pracy niż liczba uruchomionych procesów.
Istnieje również opcja ograniczenia limitu w kolejce, aby zablokować producenta, gdy jest już zbyt dużo zaległej pracy, jeśli trzeba wprowadzić ograniczenia również na szybkość i zasoby, które zużywa producent.
Funkcja robocza, która zostanie wywołana, może wykonać dowolną czynność. Może to być wrapper do niektórych poleceń systemu lub może zaimportować twoją bibliotekę python i uruchomić główną procedurę. Istnieją specyficzne systemy zarządzania procesami, które pozwalają skonfigurować konfiguracje do uruchamiania dowolnych plików wykonywalnych przy ograniczonych zasobach, ale jest to tylko podstawowe podejście do wykonywania tego zadania.
Fragmenty z tego other answer kopalni:
Podstawowe Basen:
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)
Używanie menedżera procesów i producent
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
Wypróbowałeś [Python Process pools] (http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool)? – C2H5OH
Najprostszym sposobem na to jest utworzenie programu "kontroler", który tworzy plik "multiprocessing.pool" i spawns wątków procesu roboczego (program.py), ponowne przydzielanie pracy jako zakończeniu instancji. – jozzas
Dzięki, spróbuję tego; w mojej pierwszej próbie z jakiegoś powodu doszedłem do wniosku, że multiprocessing.pool nie jest tym, czego chciałem, ale teraz wydaje się słuszne. W tym przypadku wątki robocze po prostu odrodzą program.py (jako wątek? Z podprocesorem.Popen)? Czy mógłbyś opublikować przybliżony przykład lub implementację szablonu, którą mógłbym wykonać? – steadfast