在python中,当使用多处理池时,主进程在某些情况下无法完成

时间:2015-12-16 14:20:31

标签: python multithreading queue pool

第一种情况,主要过程无法完成,

from multiprocessing import Pool, Queue

queue = Queue()

def handle(slogan):

    for i in xrange(100000):
        queue.put(slogan)
    print 'put done'  

def main():

    pools = Pool(2)
    for i in xrange(4):
        pools.apply_async(handle, args=('test', ))   
    print 'waiting all done...'

    pools.close()
    pools.join()

    print 'all done...'


if __name__ == '__main__':

    main()

此代码的结果,如下所示:

waiting all done...
put done
put done
put done
put done

我等了1个多小时。我不明白。我以为多处理模块有一些bug或什么的。所以我改变了这段代码。这次我不使用多处理队列,我只是用它来计算一些数字。代码如下:

from multiprocessing import Pool

def handle(slogan):

    tmp = 0
    for i in xrange(100000):
         tmp += i
    print 'put done'


def main():

    pools = Pool(2)
    for i in xrange(4):
        pools.apply_async(handle, args=('test', )) 
    print 'waiting all done...'

    pools.close()
    pools.join()

    print 'all done...'


if __name__ == '__main__':

    main()

代码,它成功完成,结果为:

waiting all done...
put done
put done
put done
put done
all done...

只是因为我使用Queue?我不知道为什么。谁能为我解释一下?

1 个答案:

答案 0 :(得分:0)

您没有捕获结果。您应该从apply_async()捕获返回值,并在每个值上调用get()

另外,请尝试在timeoutjoin()中指定较大的get()值。在某些版本的Python中,需要解决一个错误。

另请参阅:https://stackoverflow.com/a/3571687/4323