• 进程之间不共享全局变量


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

     

  • 相关阅读:
    [LeetCode] 806. Number of Lines To Write String
    [LeetCode] 728. Self Dividing Numbers
    [LeetCode] 852. Peak Index in a Mountain Array
    [LeetCode] 617. Merge Two Binary Trees
    [LeetCode] 876. Middle of the Linked List
    [LeetCode] 461. Hamming Distance
    不会装电脑?手把手教你装电脑,详细到螺丝!
    零基础到精通Web渗透测试的学习路线
    EXE转JPG后缀格式工具(真实JPG后缀)
    知名渗透测试利器分享
  • 原文地址:https://www.cnblogs.com/yujiemeigui/p/14298686.html
Copyright © 2020-2023  润新知