我如何使用并发函数来更改全局变量?

How can i use concurrent functions to change a global variable?

我如何编辑我的代码,以便我可以 运行 使用多处理或类似的东西同时运行函数,并以与使用常规函数相同的方式编辑全局变量的值?这是一个显示我一直在使用的代码的示例:

import multiprocessing
from multiprocessing import Process

def runInParallel(*fns):

  

  proc = []

  for fn in fns:

    p = Process(target=fn)

    p.start()

    proc.append(p)

  for p in proc:

    p.join()


variable = 1



def changethevariable():
  global variable
  variable= variable +1
  return variable
   
def changethevariable_again():
  global variable
  variable= variable +3
  return variable

runInParallel(changethevariable_again,changethevariable)
print(variable)

有很多地方不对。

  1. 按照您编写代码的方式,每个进程都有自己的 variable 副本。没有理由在一个进程中更改 variable 的值会导致它在另一个进程中发生更改。这是多进程和多线程的最大区别之一。

  2. 即使在多个进程(甚至两个线程)之间确实有一个共享变量,更新操作也很​​容易发生竞争。您在一个进程中执行 x += 1,在另一个进程中执行 x += 3。想象一下,两个线程同时读取 x,一个将值递增 1,一个将其递增 3,然后都将其写回。结果将是只有一个增量发生。

  3. 当运行多处理时,所有只在主线程中发生的代码都必须在if __name__ == '__main__'的保护下完成。在您的代码中,每个进程都在调用 runInParallel.

所以。您需要一个共享变量。你需要锁。您需要将初始化代码放在 main() 中。

import multiprocessing
from multiprocessing import Process

def runInParallel(*fns):
    global variable
    proc = []
    for fn in fns:
        p = Process(target=fn, args=(variable,))
        p.start()
        proc.append(p)

    for p in proc:
        p.join()

def changethevariable(variable):
    with variable.get_lock():
        variable.value = variable.value + 1

def changethevariable_again(variable):
    with variable.get_lock():
        variable.value = variable.value + 3

def main():
    global variable
    variable = multiprocessing.Value('i', 1)
    runInParallel(changethevariable_again, changethevariable)
    print(variable.value)

if __name__ == '__main__':
    main()