2016-01-21 31 views
0

我有一個腳本從數據庫中收集數據,過濾並放入列表中以便進一步處理。我已經在幾個進程之間拆分了數據庫中的條目,以便更快地進行過濾。這裏的片段:多重處理卡在加入Windows中

def get_entry(pN,q,entries_indicies): 

    ##collecting and filtering data 
    q.put((address,page_text,)) 
    print("Process %d finished!" % pN) 

def main(): 

    #getting entries 
    data = [] 

    procs = [] 
    for i in range(MAX_PROCESSES): 
     q = Queue() 
     p = Process(target=get_entry,args=(i,q,entries_indicies[i::MAX_PROCESSES],)) 
     procs += [(p,q,)] 
     p.start()  
    for i in procs: 
     i[0].join() 
     while not i[1].empty(): 
      #process returns a tuple (address,full data,) 
      data += [i[1].get()] 
    print("Finished processing database!") 

    #More tasks 
    #................ 

我已經在Linux(Ubuntu 14.04)上運行它,它完全正常。當我在Windows 7上運行它時,問題就開始了。該腳本在16個月中的第11個過程中陷入了i[0].join()(這對我來說完全是隨機的)。沒有錯誤信息,沒有什麼,只是凍結在那裏。與此同時,該print("Process %d finished!" % pN)則顯示所有進程,這意味着他們都走到了盡頭,所以應該有與get_entry

我想評論的過程中功能q.put行的代碼沒有問題,這一切都過得很好(當然,data結束了空)。

這是否說明Queue這是責任?爲什麼它會卡住join()?是否因Queue內部的Lock?如果是這樣,並且Queue呈現我的腳本在Windows上不可用,是否有其他方法可以將進程收集的數據傳遞給主進程中的data列表?

回答

0

想出了我最後一個問題的答案。

我用Manager代替

def get_entry(pN,q,entries_indicies): 
    #processing 

    # assignment to manager list in another process doesn't work, but appending does. 
    q += result 

def main(): 

    #blahbalh 

    #getting entries 
    data = [] 

    procs = [] 
    for i in range(MAX_PROCESSES): 
     manager = Manager() 
     q = manager.list() 
     p = Process(target=get_entry,args=(i,q,entries_indicies[i::MAX_PROCESSES],)) 
     procs += [(p,q,)] 
     p.start() 
    # input("Press enter when all processes finish") 
    for i in procs: 
     i[0].join() 
     data += i[1] 
    print("data", data)#debug 
    print("Finished processing database!") 

    #more stuff 

join()在Windows凍結由於Queue存在的本質仍然是個謎。所以問題仍然存在。