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/C++实现)
    稀疏数组-矩阵存储【C语言实现】
    mysql frm、MYD、MYI数据文件恢复,导入MySQL中
    我们为什么要分库分表?
    golang 使用goto进行多错误处理
    mongodb 查看、创建、修改、删除索引
    MyBatis中模糊搜索使用like匹配带%字符时失效问题
    MySQL 用 limit 为什么会影响性能?
    【java框架】SpringBoot(10) -- SpringBoot巧用 @Async提升API接口并发能力
    【Java代码之美】 -- Java17新特性初探
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14298686.html
Copyright © 2011-2022 走看看