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