我有一個很大的代碼庫來平行。我可以避免使用單個全局隊列來重寫數百個函數的方法簽名。我知道這很混亂;請不要告訴我,如果我使用全局變量,我在這種情況下做錯了事情,它確實是最簡單的選擇。下面的代碼工作,但我不明白爲什麼。我聲明瞭一個全局multiprocessing.Queue(),但不要聲明它應該在進程之間共享(通過將它作爲參數傳遞給worker)。 python會自動將這個隊列放入共享內存嗎?在更大規模上做這件事是否安全?在python中使用多處理時可以安全地使用全局隊列嗎?
注意:您可以看到隊列在進程之間共享:工作進程開始在空隊列上工作,並在主隊列將某些工作推入隊列之前閒置一秒。
import multiprocessing
import time
outqueue = None
class WorkerProcess(multiprocessing.Process):
def __init__(self):
multiprocessing.Process.__init__(self)
self.exit = multiprocessing.Event()
def doWork(self):
global outqueue
ob = outqueue.get()
ob = ob + "!"
print ob
time.sleep(1) #simulate more hard work
outqueue.put(ob)
def run(self):
while not self.exit.is_set():
self.doWork()
def shutdown(self):
self.exit.set()
if __name__ == '__main__':
global outqueue
outqueue = multiprocessing.Queue()
procs = []
for x in range(10):
procs.append(WorkerProcess())
procs[x].start()
time.sleep(1)
for x in range(20):
outqueue.put(str(x))
time.sleep(10)
for p in procs:
p.shutdown()
for p in procs:
p.join()
try:
while True:
x = outqueue.get(False)
print x
except:
print "done"
我強烈要求閱讀[這個問題](http://stackoverflow.com/questions/11442892/python-multiprocessing-queue-failure)的答案,而不是下面接受的答案,我認爲這是完全錯誤的。 –