2016-12-27 183 views
0

我使用的python多处理库中的代码如下:无法访问全局变量在python

from multiprocessing import Process 
import os 
from time import sleep as delay 

test = "First" 

def f(): 
    global test 
    print('hello') 
    print("before: "+test) 
    test = "Second" 

if __name__ == '__main__': 
    p = Process(target=f, args=()) 
    p.start() 
    p.join() 
    delay(1) 
    print("after: "+test) 

它应该改变test值,以便在最后一次测试的值必须是Second,但价值不会改变,并保持First。 这里是输出:

hello 
before: First 
after: First 

回答

1

你看到的行为是因为p是一个新的过程,而不是一个新的线程。当你产生一个新的进程时,它会完全复制初始进程的状态,然后开始并行执行。当你产生一个线程时,它会与你的初始线程共享内存。

由于进程具有内存隔离功能,因此不会因读取和写入共享内存而导致竞争条件错误。但是,为了将数据从您的子进程返回到父进程中,您需要使用某种形式的进程间通信(如管道),并且因为他们分配内存,所以产生的代价更高。与往常一样,在计算机科学中,你必须做出权衡。

欲了解更多信息,请参见:

基于你实际上试图完成的任务,可以考虑使用线程来代替。

0

全局状态不共享,所以子进程所做的更改不起作用。

这是为什么:

实际上,它确实改变了全局变量,但只适用于衍生 过程。如果你想在你的过程中访问它,你可以看到它。由于 它的一个过程,你的全局变量环境将被初始化,但你所做的修改将被限制在 而不是整个过程。

试试这个它解释发生了什么

from multiprocessing import Process 
import os 
from time import sleep as delay 

test = "First" 

def f2(): 
    print ("f2:" + test) 

def f(): 
    global test 
    print ('hello') 
    print ("before: "+test) 
    test = "Second" 
    f2() 

if __name__ == '__main__': 
    p = Process(target=f, args=()) 
    p.start() 
    p.join() 
    delay(1) 
    print("after: "+test) 

如果你确实需要使用从工艺修改他们就是这样做的另一种方式,阅读本docpost它可以帮助你。