我有一个简单的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()
,但没有成功。
multiprocess.Manager
的示例是在if __name__ == "__main__":
块中创建Manager
并将托管资源作为显式参数传递给工作者。 您是否尝试过以这种方式处理?我的直觉是,当在模块范围内创建管理器对象时(例如,每次创建新线程时,包括创建新管理器线程时,它会生成一个新的管理器线程),它与取消选择进程有关。 - Silas Ray