2017-12-28 9 views
0

Ich arbeite an einem Programm, das Elemente aus einer Warteschlange liest, diese ändert und in die zweite Warteschlange verschiebt. Dies sollte durch mehrere CPUs durchgeführt werden, da die Modifikationsfunktion teuer ist. Das Programm bleibt beim Drucken der Druckschleife hängen (qOut.get()).python multiprocessing queue stucked

from multiprocessing import Pool, Queue 

def update(qIn,qOut): 
    temp=qIn.get() 
    #this is going to be computationaly expensive function 
    qOut.put(temp+1) 



def main(): 

    #input queue 
    qIn=Queue() 

    #output queue 
    qOut=Queue() 

    #set input queue 
    for i in range(10): 
     qIn.put(i) 

    #set number of CPU cores 
    p=Pool(6) 

    #update each item in qIn and push it to qOut 
    for i in range(10): 
     p.apply_async(update, args=(qIn,qOut)) 

    p.close() 
    p.join() 

    #check qOut 
    for i in range(10): 
     print(qOut.get()) 




if __name__ == '__main__': 
    main() 

Antwort

1

Um in der Lage zu sein, Ihre Warteschlangen zwischen Prozessen zu teilen, müssen Sie erstellen sie ein Manager mit:

manager = multiprocessing.Manager() 
qIn = manager.Queue() 
qOut = manager.Queue() 

Manager bieten eine Möglichkeit, Daten zu erzeugen, die zwischen den verschiedenen Prozessen gemeinsam genutzt werden können, einschließlich Teilen über ein Netzwerk zwischen Prozessen, die auf verschiedenen Computern ausgeführt werden.