[英]Python multiprocessing >= 125 list never finishes
我正在嘗試為我自己的目的實現這個多處理教程 。 起初我認為它不能很好地擴展,但是當我做了一個可重復的例子時,我發現如果項目列表超過124,它似乎永遠不會返回答案。 在x = 124
它在.4秒內運行,但是當我將其設置為x = 125
它永遠不會完成。 我在Windows 7上運行Python 2.7。
from multiprocessing import Lock, Process, Queue, current_process
import time
class Testclass(object):
def __init__(self, x):
self.x = x
def toyfunction(testclass):
testclass.product = testclass.x * testclass.x
return testclass
def worker(work_queue, done_queue):
try:
for testclass in iter(work_queue.get, 'STOP'):
print(testclass.counter)
newtestclass = toyfunction(testclass)
done_queue.put(newtestclass)
except:
print('error')
return True
def main(x):
counter = 1
database = []
while counter <= x:
database.append(Testclass(10))
counter += 1
print(counter)
workers = 8
work_queue = Queue()
done_queue = Queue()
processes = []
start = time.clock()
counter = 1
for testclass in database:
testclass.counter = counter
work_queue.put(testclass)
counter += 1
print(counter)
print('items loaded')
for w in range(workers):
p = Process(target=worker, args=(work_queue, done_queue))
p.start()
processes.append(p)
work_queue.put('STOP')
for p in processes:
p.join()
done_queue.put('STOP')
newdatabase = []
for testclass in iter(done_queue.get, 'STOP'):
newdatabase.append(testclass)
print(time.clock()-start)
print("Done")
return(newdatabase)
if __name__ == '__main__':
database = main(124)
database2 = main(125)
好! 來自文檔 :
警告如上所述,如果子進程已將項目放入隊列(並且它未使用JoinableQueue.cancel_join_thread),則在將所有緩沖的項目刷新到管道之前,該進程不會終止。 這意味着,如果您嘗試加入該進程,則可能會遇到死鎖,除非您確定已經使用了已放入隊列的所有項目。 類似地,如果子進程是非守護進程,則父進程在嘗試加入其所有非守護進程子進程時可能會在退出時掛起。 請注意,使用管理器創建的隊列沒有此問題。 請參閱編程指南。
正如我在前面的評論中所指出的那樣,代碼在done_queue
Queue耗盡之前嘗試進行.join()
進程 - 並且在以一種時髦的方式更改代碼以確保done_queue
在.join()
之前耗盡之后,代碼為一百萬件物品做得很好。
所以這是飛行員錯誤的一個例子,雖然相當模糊。 至於為什么行為取決於傳遞給main(x)
,它是不可預測的:它取決於內部如何進行緩沖。 好好玩 ;-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.