我如何使用并发函数来更改全局变量?
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)
有很多地方不对。
按照您编写代码的方式,每个进程都有自己的 variable
副本。没有理由在一个进程中更改 variable
的值会导致它在另一个进程中发生更改。这是多进程和多线程的最大区别之一。
即使在多个进程(甚至两个线程)之间确实有一个共享变量,更新操作也很容易发生竞争。您在一个进程中执行 x += 1
,在另一个进程中执行 x += 3
。想象一下,两个线程同时读取 x
,一个将值递增 1,一个将其递增 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()
我如何编辑我的代码,以便我可以 运行 使用多处理或类似的东西同时运行函数,并以与使用常规函数相同的方式编辑全局变量的值?这是一个显示我一直在使用的代码的示例:
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)
有很多地方不对。
按照您编写代码的方式,每个进程都有自己的
variable
副本。没有理由在一个进程中更改variable
的值会导致它在另一个进程中发生更改。这是多进程和多线程的最大区别之一。即使在多个进程(甚至两个线程)之间确实有一个共享变量,更新操作也很容易发生竞争。您在一个进程中执行
x += 1
,在另一个进程中执行x += 3
。想象一下,两个线程同时读取x
,一个将值递增 1,一个将其递增 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()