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