启动多个多进程管理器变得非常

2024-10-03 09:20:38 发布

您现在位置:Python中文网/ 问答频道 /正文

在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消息被打印出来。在

看起来,当我启动一个新的管理器时,它会创建一个对以前管理器引用的所有对象的引用。在大型应用程序中,这意味着启动/关闭非常缓慢。在

有什么解决办法吗?或者至少,有什么解释为什么会这样?在


Tags: 对象import程序应用程序消息管理器loggingmultiprocessing
1条回答
网友
1楼 · 发布于 2024-10-03 09:20:38

我想我明白了。在

class BaseProxy(object):
     # ...
     def _incref(self):
         # ...
         util.debug('INCREF %r', self._token.id)
     # ...
     def _after_fork(self):
         # ...
         self._incref()
         # ...

您使用的是使用fork创建新进程的linux机器。 想法:每次启动管理器时,current进程都是分叉的,并调用\u incref。在

  1. 帮我证明一下:首先创造所有的管理者,然后创造新的价值观。这还在增加参考文献吗?在
  2. 看看执行情况。在

相关问题 更多 >