zoukankan      html  css  js  c++  java
  • 进程之间不共享全局变量

    一、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()

     

  • 相关阅读:
    C语言修炼-第2天
    static_cast, dynamic_cast, reinterpret_cast, const_cast的区别
    构造函数不能为虚函数的原因
    matlab2016b ubuntu命令行安装 + matconvnet的安装
    python debug open_files
    构造函数不能被继承的原因
    NNVM代码阅读
    ncnn阅读
    Deep TEN: Texture Encoding Network
    git命令笔记
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14298686.html
Copyright © 2011-2022 走看看