Bahman
Bahman

Reputation: 109

Can't access global variable in python

I'm using multi processing library in python in code below:

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) 

It's supposed to change the value of test so at last the value of test must be Second, but the value doesn't change and remains First. here is the output:

hello
before: First
after: First

Upvotes: 0

Views: 271

Answers (2)

Jaimin Ajmeri
Jaimin Ajmeri

Reputation: 602

Global state is not shared so the changes made by child processes has no effect.

Here is why:

Actually it does change the global variable but only for the spawned process. If you would access it within your process you can see it. As its a process your global variable environment will be initialized but the modification you make will be limited to the process itself and not the whole.

Try this It explains whats happening

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) 

If you really need to use modify from the process their's another way of doing it, read this doc or post it might help you.

Upvotes: 2

disatisfieddinosaur
disatisfieddinosaur

Reputation: 1550

The behavior you're seeing is because p is a new process, not a new thread. When you spawn a new process, it copies your initial process's state completely and then starts executing in parallel. When you spawn a thread, it shares memory with your initial thread.

Since processes have memory isolation, they won't create race-condition errors caused by reading and writing to shared memory. However, to get data from your child process back into the parent, you'll need to use some form of inter-process communication like a pipe, and because they fork memory, they are more expensive to spawn. As always in computer science, you have to make a tradeoff.

For more information, see:

Based on what you're actually trying to accomplish, consider using threads instead.

Upvotes: 2

Related Questions