2017-04-08 102 views
1

我想使用python多處理填充字符串隊列,然後打印出來,但有麻煩。有人能指出我做錯了什麼嗎?python多處理隊列獲取並把

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() 

該程序在不打印任何內容的情況下執行。

回答

1

如果get_it在填充隊列之前執行,它將立即返回,不會打印任何內容。

您需要確保在調用get_it之前填充隊列。

例如,等到enqueue被稱爲直到所有的項目進行排隊:

... 

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() 

或修改get_it像下面沒有結束得太早:

... 

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() 

或使用multiprocess.pool.Pool.map代替:

import multiprocessing.pool 

def get_it(item): 
    print(item) 

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

啊,明白了。謝謝! – Nitro