源代码如下:
#!/usr/bin/env python# -*- coding: utf-8 -*-from multiprocessing import Processimport osgcc='parent'# 子进程要执行的代码def run_proc(name):##################################### print 'Son Process:',gcc#################################### gcc='son' print 'Son Process:',gccif __name__=='__main__': p = Process(target=run_proc, args=('test',)) p.start() p.join() print 'Parent Process:',gcc
我看到资料说【多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中】,我就想试试。上面代码可以运行,输出也符合该句话。但是问题来了:
我把中间的那行注释恢复成代码,也就是多了一条print语句,结果就报错了,这是为啥??
解决方案
Python 的变量作用域问题。解释器把你run_proc
里的 gcc
当成新变量了。
在 print
前添加 global gcc
即可。
#!/usr/bin/env python# -*- coding: utf-8 -*-from multiprocessing import Processimport osgcc='parent'# 子进程要执行的代码def run_proc(name): global gcc#################################### print 'Son Process:',gcc#################################### gcc='son' print 'Son Process:',gccif __name__=='__main__': p = Process(target=run_proc, args=('test',)) p.start() p.join() print 'Parent Process:',gcc
就可以得到期望的结果。
顺便说一句,下次提问记得把错误信息也写在题目里。
补充:如果删掉gcc='son'
这句,不加 global
也能跑通,这是因为 gcc='son'
同时也被 Python 当作了对函数内局部变量的声明语句。
原来的代码相当于你先用了 gcc
这个局部变量,然后才声明的,所以就出错了。去掉这一句 Python 解释器就会认为你在用全局变量,而不是局部变量。