Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多处理模块的脚本未终止_Python_Python 2.7_Multiprocessing_Python Multiprocessing - Fatal编程技术网

Python 使用多处理模块的脚本未终止

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

以下代码不在此处打印。有什么问题? 我在我的两台机器(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 "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")