2016-05-11 2 views
0

Ich versuche, Aufträge an einen Pool eins nach dem anderen zu senden (aufgrund der Speicherbegrenzungen kann ich keine Karte verwenden). Ist es möglich, dass der Pool verdaut wird, wenn er verfügbare Mitarbeiter hat und ansonsten warten muss? z.B. kann ich sowas machen? p = Pool(n_workers) for item in list: p.work_on_this(item) wobei work_on_this den Job sendet, wenn der Pool mehr Arbeiter zur Verfügung hat und ansonsten warten, bis es funktioniert.Multiprocessing Python ist es möglich, einen Job in den Pool zu senden

+0

Sie könnten für etwas ähnliches wie http://stackoverflow.com/questions/17909132/python-multiprocessing-set-spawning-process-to-wait suchen. Ich denke, damit kann eine Logik aufgebaut werden. – pmaniyan

+1

Sind Sie sicher, dass Sie 'map' nicht verwenden können? Wenn Sie 'chunksize = 1' setzen, werden die Jobs nacheinander gesendet. – tdelaney

+1

Wie wäre es mit 'imap' anstatt mit' map'? – tjollans

Antwort

0

Die Lösung des Problems besteht in der Verwendung eines Semaphors, der mit der Anzahl der Worker initialisiert wurde. Sie erwerben und lösen den Semaphor vor dem Füttern des Pools und nachdem ein Arbeiter die Aufgabe erfüllt hat.

Hier ist ein Beispiel mit Python 2.6 oder höher.

from threading import Semaphore 
from multiprocessing import Pool 


def TaskManager: 
    def __init__(self, processes): 
     self.pool = Pool(processes=processes) 
     self.workers = Semaphore(processes) 

    def new_task(self): 
     """Start a new task, block if all workers are busy.""" 
     self.workers.acquire() 
     self.pool.apply_async(function, callback=self.task_done) 

    def task_done(self, results): 
     """Called once task is done, releases the caller if blocked.""" 
     self.workers.release() 
Verwandte Themen