2017-04-08 8 views
1

Ich versuche, Python-Multiprocessing zu verwenden, um eine Warteschlange mit Zeichenfolgen zu füllen und sie dann wieder auszudrucken, aber habe Probleme. Könnte jemand darauf hinweisen, was ich falsch mache?Python Multiprozessing-Warteschlange get und put

import multiprocessing 

my_q = multiprocessing.Queue() 
my_list =[i for i in range(0,100)] 

def enqueue(q): 
    for data in my_list: 
     q.put(data) 

def get_it(q): 
    while not q.empty(): 
     item = q.get() 
     print(item) 


p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p1.start() 
p2.start() 

p1.join() 
p2.join() 

Dieses Programm wird ausgeführt, ohne etwas zu drucken.

Antwort

1

Wenn get_it ausgeführt wird, bevor die Warteschlange gefüllt ist, wird sie sofort zurückgegeben und gibt nichts aus.

Sie müssen sicherstellen, dass die Warteschlange aufgefüllt ist, bevor get_it aufgerufen wird.

Zum Beispiel warten, bis enqueue aufgerufen wird, bis alle Elemente der Warteschlange eingereiht werden:

... 

p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p1.start() 
p1.join() 

p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p2.start() 
p2.join() 

oder Ändern get_it wie unten nicht zu Ende zu früh:

... 

def get_it(q): 
    while True: 
     item = q.get() 
     if item is None: # loop until sentinel value (None) appear. 
      break 
     print(item) 


my_list.append(None) # sentinel value to denote end of input value 
p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p1.start() 
p2.start() 
p1.join() 
p2.join() 

oder benutzt multiprocess.pool.Pool.map statt:

import multiprocessing.pool 

def get_it(item): 
    print(item) 

pool = multiprocessing.pool.Pool() 
pool.map(get_it, range(100)) 
+0

Ah hat es. Vielen Dank! – Nitro

Verwandte Themen