The docs (python 3.4) explain that with spawn
, "the child process will only inherit those resources necessary to run the process object's run()
method".
But which objects are "necessary"? The way I read it suggested to me that all the objects that can be reached from inside run()
are "necessary", including arguments passed as args
to Process.__init__
, plus whatever is stored in global variables, as well as classes, functions defined in global scope and their attributes. However, this is incorrect; the following code confirms that the objects stored in global variables aren't inherited:
# running under python 3.4 / Windows # but behaves the same under Unix import multiprocessing as mp x = 0 class A: y = 0 def f(): print(x) # 0 print(A.y) # 0 def g(x, A): print(x) # 1 print(A.y) # 0; really, not even args are inherited? def main(): global x x = 1 A.y = 1 p = mp.Process(target = f) p.start() q = mp.Process(target = g, args = (x, A)) q.start() if __name__=="__main__": mp.set_start_method('spawn') main()
Is there a clear rule that states which objects are inherited?
EDIT:
To confirm: running this on Ubuntu produces the same output. (Thanks to @mata for clarifying that I forgot add global x
to main()
. This omission made my example confusing; it would also affect the result if I were to switch 'spawn'
to 'fork'
under Ubuntu. I now added global x
to the code above.)