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

标签 python process multiprocessing python-multiprocessing pool

我有一个简单的 python 多处理脚本,它设置了一个工作池,试图将工作输出附加到管理器列表。该脚本有 3 个调用堆栈: - 主要调用 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 中无济于事。

最佳答案

基本上,sr2222 在他的评论中提到的是正确的。来自multiprocessing manager docs ,它表示 ____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()

关于python multiprocessing,管理器启动进程生成循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937895/

相关文章:

python - 在 Azure 表存储中存储日期时间字段

python - 如何联合更新两个数据帧?

python - 如何使用 Python 处理 SQL 转储

c - C程序不会终止

c++ - 流程处理的封装会产生问题

python - 如何捕获在python中运行的vba代码中的异常

c - 如何在C中按顺序执行子进程

python - 在 python 中的多个内核上分配许多独立的、昂贵的操作

python - 有没有办法停止 concurrent.futures 中正在运行的进程?

python - 通过 multiprocessing.Queue 传递 numpy 数组