Python 使用多处理模块的脚本未终止
以下代码不在此处打印。有什么问题? 我在我的两台机器(Windows7、Ubuntu12.10)和 它不会在所有情况下打印Python 使用多处理模块的脚本未终止,python,python-2.7,multiprocessing,python-multiprocessing,Python,Python 2.7,Multiprocessing,Python Multiprocessing,以下代码不在此处打印。有什么问题? 我在我的两台机器(Windows7、Ubuntu12.10)和 它不会在所有情况下打印“here” from multiprocessing import Queue, Process def runLang(que): print "start" myDict=dict() for i in xrange(10000): myDict[i]=i que.put(myDict) print "fini
“here”
from multiprocessing import Queue, Process
def runLang(que):
print "start"
myDict=dict()
for i in xrange(10000):
myDict[i]=i
que.put(myDict)
print "finish"
def run(fileToAnalyze):
que=Queue()
processList=[]
dicList=[]
langs= ["chi","eng"]
for lang in langs:
p=Process(target=runLang,args=(que,))
processList.append(p)
p.start()
for p1 in processList:
p1.join()
print "here"
for _ in xrange(len(langs)):
item=que.get()
print item
dicList.append(item)
if __name__=="__main__":
processList = []
for fileToAnalyse in ["abc.txt","def.txt"]:
p=Process(target=run,args=(fileToAnalyse,))
processList.append(p)
p.start()
for p1 in processList:
p1.join()
这是因为当您
将大量项目放入多处理.Queue
中时,一旦底层管道已满,它们最终会在内存中得到缓冲。缓冲区不会被刷新,直到有东西开始从队列的另一端读取,这将允许管道接受更多数据。在所有队列
实例的缓冲区完全刷新到其底层管道
之前,进程
无法终止。这意味着,如果您试图加入一个进程,而没有另一个进程/线程在其队列上调用get
,则可能会死锁。这是:
警告
如上所述,如果子进程已将项目放入队列(和
它没有使用JoinableQueue.cancel_join_thread
),则该进程
将不会终止,直到所有缓冲项都已刷新到
烟斗
这意味着,如果您尝试加入该进程,可能会出现死锁
除非您确定已放入队列的所有项目
已经被消耗掉了。类似地,如果子进程是非守护进程
然后,当父进程尝试加入其所有子进程时,它可能挂起退出
非恶魔儿童
请注意,使用管理器创建的队列没有此问题
您可以通过在清空父级中的队列
之前不调用join
来解决此问题:
for _ in xrange(len(langs)):
item = que.get()
print(item)
dicList.append(item)
# join after emptying the queue.
for p in processList:
p.join()
print("here")