进程之间不共享全局变量

一、global关键字

在函数中定义的变量如果加上global关键字,则表示要声明修改全局变量的内存地址。

二、原因:

创建的子进程会对主进程的资源进行拷贝。创建的子进程实际上就是主进程的一个副本。

(资源包含:代码、分配的内

存等)

三、进程之间不共享全局变量——未调用join方法

from multiprocessing import Process
from time import *

g_list = list() # 定义全局变量


def add_data():
    """添加数据任务"""
    for i in range(3):
        """
            列表是可变类型,可以在原有的内存基础上修改数据,且修改后内存地址不变,
            所以不需要加上global关键字。
        """
        g_list.append(i)
        print("add:", i)
        sleep(0.2)
    print("添加的数据为:", g_list)


def read_data():
    """读取数据任务"""
    print("read",g_list)


p1 = Process(target=add_data)
p2 = Process(target=read_data)

p1.start()
p2.start()
View Code

执行结果:

四、进程之间不共享全局变量——调用join方法

from multiprocessing import Process
from time import *

g_list = list() # 定义全局变量


def add_data():
    """添加数据任务"""
    for i in range(3):
        """
            列表是可变类型,可以在原有的内存基础上修改数据,且修改后内存地址不变,
            所以不需要加上global关键字。
        """
        g_list.append(i)
        print("add:", i)
        sleep(0.2)
    print("添加的数据为:", g_list)


def read_data():
    """读取数据任务"""
    print("read",g_list)


p1 = Process(target=add_data)
p2 = Process(target=read_data)


p1.start()
p1.join() # 表示主进程等待p1子进程添加完数据后再继续往下执行

p2.start()

执行结果:

五、Windows系统的BUG

1、问题:此BUG只会发生在Windows系统中。即:创建子进程后,子进程除了会拷贝主进程的代码外,还会拷贝主进程的执行代码。从而导致了无限递归的错误。

2、解决:

通过判断主否为主模块来解决此BUG。

if __name__ == '__main__':

pass

3、if__name__ == '__main__':的两大作用:

防止别人导入你的模块

防止创建子进程后,子进程会拷贝主进程的代码外,还会拷贝主进程的执行代码,导致无限递归创建子进程错误

Windows中多进程Bug演示:

from multiprocessing import *
from time import *

g_list = list()  # 定义全局变量


def add_data():
    """添加数据任务"""
    for i in range(3):

        g_list.append(i)

        print("add:", i)
        sleep(0.2)
    print("添加的数据为:", g_list)


def read_data():
    """读取数据任务"""
    print("read", g_list)


if __name__ == "__main__":
    p1 = Process(target=add_data)  # 创建添加数据子进程
    p2 = Process(target=read_data)  # 创建读取数据子进程

    p1.start()
    p1.join()

    p2.start()

 

原文地址:https://www.cnblogs.com/yujiemeigui/p/14298686.html