9阅网

您现在的位置是:首页 > 知识 > 正文

知识

python - 在Python中用不同的进程写入全局变量

admin2022-11-07知识18

我有一个全局变量,我想用不同的进程写进去(代码如下).我使用了一个重入锁来避免竞赛条件(用许多线程写到同一个地方).有趣的是,全局变量似乎根本不会被修改,但只用主线程成功地修改了它(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


【回答】:

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

然而,正如文档中所说。https:/docs.python.org3librarymultiprocessing.html#sharing-state-between-processes(进程间共享状态)。 如果有必要的话,有一些方法可以在进程之间共享内存。

在这种情况下,我们可以简单地使用一个 "Value "对象来共享内存映射。

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