在python应用程序中,我需要启动多个多处理管理器. 我似乎在第二个管理器启动时,第一个管理器中引用的所有对象都会得到一个增量。 在第三次启动时,第一个和第二个管理器创建的所有对象都会得到另一个增量。等等。 我不明白为什么在一个新的进程中,一个全新的管理器的启动会导致其他管理器上托管的对象的所有这些增加,这会导致程序启动/停止花费太长时间。在
这个小脚本完全再现了在python 2.7和3.2中测试的行为:
from __future__ import print_function
import multiprocessing, logging
# # Activate multiprocessing logging
mplog = multiprocessing.get_logger()
mplog.setLevel(multiprocessing.util.DEBUG)
mplog.addHandler(logging.StreamHandler())
objs=[]
def newman(n=50):
global objs
m=multiprocessing.Manager()
print('created')
for i in range(n):
objs.append(m.Value('i',i))
return m
print('#### first man')
m1=newman()
print ('#### second man')
m2=newman()
print ('#### third man')
m3=newman(0)
在第一个管理器启动之后,记录器打印出与前50个对象的创建相关的消息。在
但是当第二个管理器启动时(在它创建任何对象之前),记录器将精确地输出50个增量留言。然后遵循有关在manager 2上创建50个新对象的消息。在
当第三个管理器启动时——在它创建任何对象之前——会打印100条增量消息。在
在m3创建之后没有看到任何对象创建消息,因为我将0传递给newman()函数。在
当程序结束时,同样数量的DECREF消息被打印出来。在
看起来,当我启动一个新的管理器时,它会创建一个对以前管理器引用的所有对象的引用。在大型应用程序中,这意味着启动/关闭非常缓慢。在
有什么解决办法吗?或者至少,有什么解释为什么会这样?在
我想我明白了。在
您使用的是使用fork创建新进程的linux机器。 想法:每次启动管理器时,current进程都是分叉的,并调用\u incref。在
相关问题 更多 >
编程相关推荐