在进程

时间:2018-01-22 23:53:44

标签: python multithreading scope

所以,我在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中)。即使它被改变了,我相信当它们同时运行它会重置,因为进程会调用并重置值,我真的不知道如何解决这种情况。我确实理解范围,但我读到的所有内容都表明这是宣告这一点的正确方法,我也很困惑,但是这样做了。我错过了什么/我错误处理的语法是什么?我确信这是一个简单的问题,并为此道歉,但在这个网站或其他地方找不到它,这让我疯狂。

3 个答案:

答案 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()