所以,我在python中创建的一个复杂的(至少对我来说)程序缺少的一个是我在两个函数之外有两个变量(这两个函数都作为进程运行,并且进程按预期并发执行),我遇到的问题是Process函数正在改变外部(全局)变量,但是当我试图从另一个中获取一个时,它没有得到正确的值(实际上,第一个函数没有收到任何变化)当另一个函数打印出来时。我做了一个非常简化的版本来帮助解释:
from multiprocessing import Process
import time
global n
def func1():
n = False
while True:
print(n)
time.sleep(1)
def func2():
n = False
while True:
n = True
time.sleep(1)
Process(target=func1).start()
Process(target=func2).start()
所以,如你所见,n没有被改变(至少不在func1中)。即使它被改变了,我相信当它们同时运行它会重置,因为进程会调用并重置值,我真的不知道如何解决这种情况。我确实理解范围,但我读到的所有内容都表明这是宣告这一点的正确方法,我也很困惑,但是这样做了。我错过了什么/我错误处理的语法是什么?我确信这是一个简单的问题,并为此道歉,但在这个网站或其他地方找不到它,这让我疯狂。
答案 0 :(得分:0)
如果要在函数内部更改全局变量的值,还必须在该函数内显式声明该变量为全局变量,否则它是局部变量。
def func1():
global n
n = False
...
答案 1 :(得分:0)
也许这会对你有帮助。
import time
from multiprocessing import Process, Manager, Value
manager = Manager()
n = manager.Value('n', False)
def func1(n):
n = False
while True:
print(n)
time.sleep(1)
def func2(n):
n = False
while True:
n = True
print(n)
time.sleep(1)
Process(target=func1, args=(n,)).start()
Process(target=func2, args=(n,)).start()
答案 2 :(得分:0)
这里最简单的解决方案是在两个进程中都有Value
(基本上是共享内存中的对象)。如果你打算用它做非原子的事情(你很可能),你还需要一个Lock
来同步对这个内存的访问。
你不需要做任何全球性的事情。
from multiprocessing import Process, Lock, Value
from ctypes import c_bool
import time
def func1(n, lock):
while True:
with lock:
print(n.value)
time.sleep(1)
def func2(n, lock):
while True:
with lock:
n.value = True
time.sleep(1)
n = Value(c_bool, False)
lock = Lock()
Process(target=func1, args=(n, lock)).start()
Process(target=func2, args=(n, lock)).start()