【问题标题】:Global variable increment and python multiprocessing全局变量增量和python多处理
【发布时间】:2013-06-13 14:53:57
【问题描述】:

您好,我有以下多进程代码,我想确保全局变量 ctr 应该被决策树的所有端节点或叶子更新。但它没有发生。

    ctr=0

            def update(l,n):
               global ctr
               l.acquire()
               ctr+=n
               l.release()

    def func(x,i):
        p2=[]
        if i > 100:
           lock=Lock()
                        update(lock,len(rl))
        # create list a1
        # create list a2
        i=len(a1)
        for a in a1:
            for b in a2:
                if x > (a+b):
                    proc=Process(target=func,args=(a+b,i,))
                    p2.append(proc)

        for p in p2:
            p.start()
            p.join()

【问题讨论】:

    标签: python global-variables multiprocessing global


    【解决方案1】:

    当您使用 Python(或任何其他语言)启动新进程时,所有进程都使用相同的内存段进行读取访问。但是,一旦您开始写入某些内存(例如更新变量),该变量就会被复制到新进程自己的内存段中。

    换句话说,你不能更新一个全局变量并期望多个进程看到相同的值,你需要某种共享内存。

    查看Multiprocessing上的文档

    但请记住,更新全局变量涉及一定数量的锁定,基本上是强制您的多个进程以串行方式运行。根据您的用例,这可能会对性能产生负面影响。您应该尽量避免使用全局状态(这是更一般的建议,但在多处理情况下,使用全局状态会更糟。)

    【讨论】:

    • 我已经编辑了带锁的代码。但它仍然无法正常工作。
    • 我的意思是您需要使用某种共享内存机制,例如 multiprocessing.Value,这将为您进行锁定,因此您不必这样做。请注意,锁定会带来性能损失。
    猜你喜欢
    • 2023-03-15
    • 2012-06-28
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多