4

我有一个简单的 python 多处理脚本,它设置了一个试图将工作输出附加到管理器列表的工作人员池。该脚本有 3 个调用堆栈: - main 调用 f1,它产生多个调用另一个函数 g1 的工作进程。当尝试调试脚本时(顺便说一下在 Windows 7/64 位/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 无济于事。

4

1 回答 1

6

基本上,sr2222 在他的评论中提到的是正确的。从多处理管理器文档中,它说____main____ 模块必须可由子模块导入。每个管理器“对象对应于一个衍生的子进程”,因此每个子进程基本上都在重新导入您的模块(您可以通过在我的固定版本中添加模块范围内的打印语句来查看!)......这会导致无限递归。

一种解决方案是将您的管理器代码移动到 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()
于 2012-08-13T16:54:23.293 回答