【问题标题】:Writing to a global variable with different processes in Python在 Python 中写入具有不同进程的全局变量
【发布时间】:2020-05-20 13:56:32
【问题描述】:

我有一个全局变量,我想用不同的进程写入它(下面的代码)。 我使用可重入锁来避免竞争条件(使用许多线程写入同一个地方)。 有趣的是,全局变量似乎根本没有被修改,但仅使用主线程成功修改了它(bar 函数)。 如何写入具有不同进程的全局变量?

import multiprocessing as mp
from multiprocessing import Pool
from threading import RLock

lock = RLock()
global_counter = 0
def foo(num):
    global global_counter
    print(num) # prints 3,4,5
    with lock:
        global_counter = global_counter + 1

def bar():
    global global_counter
    with lock:
        global_counter = global_counter + 1

if __name__ == '__main__':
    p = Pool(mp.cpu_count())
    list(p.map(foo, [3,4,5]))
    print(global_counter) # prints 0
    bar()
    print(global_counter) # prints 1

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    进程的行为与线程不同,具体来说,它们不共享内存。全局变量被复制到各自的进程中,这意味着它们在主进程中的值不会改变——这就是造成问题混乱的原因。

    但是,如文档中所述:https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes 如果有必要,可以在进程之间共享内存。

    在这种情况下,我们可以简单地使用使用“值”对象的共享内存映射

    import multiprocessing as mp
    from multiprocessing import Pool, Value
    from threading import RLock
    
    lock = RLock()
    global_counter = 0
    def foo(num):
        global global_counter
        print(num) # prints 3,4,5
        with lock:
            global_counter.value = global_counter.value + 1
    
    def bar():
        global global_counter
        with lock:
            global_counter.value = global_counter.value + 1
    
    
    def global_test():
        global global_counter
        global_counter = Value('d', 0)
        p = Pool(mp.cpu_count())
        list(p.map(foo, [3,4,5]))
        print(global_counter) # prints 3
        bar()
        print(global_counter) # prints 4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2021-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多