python多处理,管理器启动进程生成循环

时间:2012-08-13 15:54:04

标签: python process multiprocessing python-multiprocessing pool

我有一个简单的python多处理脚本,它设置一个工作池,试图将工作输出附加到Manager列表。该脚本有3个调用堆栈: - 主调用f1,它产生几个调用另一个函数g1的工作进程。当一个人试图调试脚本时(偶然在Windows 7/64 bit / VS 2010 / PyTools上),脚本会运行到嵌套的进程创建循环中,从而产生无数个进程。谁能确定原因?我确定我错过了很简单的事情。这是有问题的代码: -

import multiprocessing
import logging

manager = multiprocessing.Manager()
results = manager.list()

def g1(x):
    y = x*x
    print "processing: y = %s" % y
    results.append(y)

def f1():
    logger = multiprocessing.log_to_stderr()
    logger.setLevel(multiprocessing.SUBDEBUG)

    pool = multiprocessing.Pool(processes=4)
    for (i) in range(0,15):
        pool.apply_async(g1, [i])
    pool.close()
    pool.join()

def main():
    f1()

if __name__ == "__main__":
    main()

PS:尝试将multiprocessing.freeze_support()添加到main无效。

1 个答案:

答案 0 :(得分:5)

基本上,sr2222在评论中提到的是正确的。从multiprocessing manager docs开始,它表示____main____模块必须由孩子们输入。每个经理“对象对应一个衍生的子进程”,所以每个孩子基本上都是重新导入你的模块(你可以看到在模块范围内添加一个print语句到我的固定版本!)......这会导致无限递归。

一种解决方案是将经理代码移到f1():

import multiprocessing
import logging

def g1(results, x):
    y = x*x
    print "processing: y = %s" % y
    results.append(y)

def f1():
    logger = multiprocessing.log_to_stderr()
    logger.setLevel(multiprocessing.SUBDEBUG)
    manager = multiprocessing.Manager()
    results = manager.list()
    pool = multiprocessing.Pool(processes=4)
    for (i) in range(0,15):
        pool.apply_async(g1, [results, i])
    pool.close()
    pool.join()


def main():
    f1()

if __name__ == "__main__":
    main()