2012-07-25 62 views
0

我無法弄清楚下面的python多處理代碼有什麼問題。它不會終止。任何建議將不勝感激。Python多處理的基本問題

from multiprocessing import Process, Queue, Lock 

def hello(num, myqueue): 
    while True: 
     item = myqueue.get() 
     print 'Thread ', num, 'got', item 
    return 

def put_on_queue(myqueue): 
    for i in range(10): 
     myqueue.put(i) 
    return 

if __name__ == '__main__': 
    processes = [] 

    myqueue = Queue() 

    for i in range(4): 
     proc = Process(target = hello, args = (i, myqueue)) 
     proc.start() 
     processes.append(proc) 

    put_on_queue(myqueue) 

    for proc in processes: 
     proc.join() 

--------------編輯-----------------

OK,所以根據該意見我收到了一些在線幫助,我修改了我的代碼,如下所示。仍然沒有運氣:-(

def hello(num, myqueue): 
    while not exit_flag: 
    item = myqueue.get(False,5) 
    print 'Thread ', num, 'got', item 
    return 


def put_on_queue(myqueue): 
    global exit_flag 
    for i in range(10):   
    myqueue.put(i) 

    while not myqueue.empty(): 
     pass 
    exit_flag = 1 

    return 

if __name__ == '__main__': 
    mylock = Lock() 
    processes = [] 
    myqueue = Queue() 

    exit_flag = 0 

    for i in range(4): 
    proc = Process(target = hello, args = (i, myqueue)) 
    #proc.daemon = True 
    proc.start() 
    processes.append(proc) 

    put_on_queue(myqueue) 

    for proc in processes: 
    proc.join() 

回答

1

有你hello函數中無限循環。 你必須把sentinent作爲最後的值到隊列中,請檢查並打破循環。

+0

你是對的......即使'queue.get'沒有被阻塞,它也會被循環卡住 – 2012-07-25 02:02:02

+0

一旦你加入了所有的進程,子進程會自動終止,無論它是否處於無限循環中。想一想,請參閱我昨天發佈的[question](http://stackoverflow.com/questions/11620431/basic-python-multi-threading-issue)。 – JZee 2012-07-25 02:04:59

+0

@JayZee:我想你誤解了其他答案。 orm [.join()')的[documentation](http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.join):*「阻塞調用線程,直到join()方法被稱爲終止或直到發生可選的超時。「*因此調用進程只能在子進程終止時終止。但他們從來沒有做過!請注意,在您的其他問題中,**隊列**已加入,而不是其他線程。 – 2012-07-25 02:13:13