无法在python中访问全局变量

时间:2016-12-27 06:31:00

标签: python python-multiprocessing

我在下面的代码中使用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的值,所以最后test的值必须是Second,但值不会改变并保持First 。 这是输出:

hello
before: First
after: First

2 个答案:

答案 0 :(得分:1)

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

由于进程具有内存隔离,因此它们不会因读取和写入共享内存而导致创建竞争条件错误。但是,要将子进程中的数据恢复到父进程,您需要使用某种形式的进程间通信(如管道),并且因为它们分叉内存,所以它们的生成成本更高。和计算机科学一样,你必须做出权衡。

有关详细信息,请参阅:

根据您实际尝试完成的内容,请考虑使用线程。

答案 1 :(得分: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,这可能会对您有所帮助。