python2.7 - python【多进程】关于进程的变量的问题

查看:109
本文介绍了python2.7 - python【多进程】关于进程的变量的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

源代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process
import os

gcc='parent'

# 子进程要执行的代码
def run_proc(name):
####################################
#    print 'Son Process:',gcc
####################################
    gcc='son'
    print 'Son Process:',gcc

if __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 Process
import os

gcc='parent'

# 子进程要执行的代码
def run_proc(name):
    global gcc
####################################
    print 'Son Process:',gcc
####################################
    gcc='son'
    print 'Son Process:',gcc

if __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 解释器就会认为你在用全局变量,而不是局部变量。

这篇关于python2.7 - python【多进程】关于进程的变量的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆