【发布时间】:2015-10-01 13:22:13
【问题描述】:
我有一个庞大的代码库要并行化。通过使用单个全局队列,我可以避免重写数百个函数的方法签名。我知道这很乱;请不要告诉我,如果我使用全局变量,在这种情况下我做错了什么,这确实是最简单的选择。下面的代码有效,但我不明白为什么。我声明了一个全局 multiprocessing.Queue() 但没有声明它应该在进程之间共享(通过将它作为参数传递给工作人员)。 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"
【问题讨论】:
-
我强烈建议阅读this question 的答案,而不是下面接受的答案,我认为这是完全错误的。
标签: python multithreading multiprocessing shared-memory python-multiprocessing