• Python大数据之Python进阶(四)进程的注意点


    进程的注意点

    学习目标

    • 能够说出进程的注意点

    1. 进程的注意点介绍

    1. 进程之间不共享全局变量
    2. 主进程会等待所有的子进程执行结束再结束

    2. 进程之间不共享全局变量

    import multiprocessing
    import time
    
    # 定义全局变量
    g_list = list()
    
    
    # 添加数据的任务
    def add_data():
        for i in range(5):
            g_list.append(i)
            print("add:", i)
            time.sleep(0.2)
    
        # 代码执行到此,说明数据添加完成
        print("add_data:", g_list)
    
    
    def read_data():
        print("read_data", g_list)
    
    
    if __name__ == '__main__':
        # 创建添加数据的子进程
        add_data_process = multiprocessing.Process(target=add_data)
        # 创建读取数据的子进程
        read_data_process = multiprocessing.Process(target=read_data)
    
        # 启动子进程执行对应的任务
        add_data_process.start()
        # 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
        add_data_process.join()
        read_data_process.start()
    
        print("main:", g_list)
    
        # 总结: 多进程之间不共享全局变量Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    执行结果:

    add: 0
    add: 1
    add: 2
    add: 3
    add: 4
    add_data: [0, 1, 2, 3, 4]
    main: []
    read_data []Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    进程之间不共享全局变量的解释效果图:

    进程关系

    3. 进程之间不共享全局变量的小结

    • 创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

    4. 主进程会等待所有的子进程执行结束再结束

    假如我们现在创建一个子进程,这个子进程执行完大概需要2秒钟,现在让主进程执行0.5秒钟就退出程序,查看一下执行结果,示例代码如下:

    import multiprocessing
    import time
    
    
    # 定义进程所需要执行的任务
    def task():
        for i in range(10):
            print("任务执行中...")
            time.sleep(0.2)
    
    if __name__ == '__main__':
        # 创建子进程
        sub_process = multiprocessing.Process(target=task)
        sub_process.start()
    
        # 主进程延时0.5秒钟
        time.sleep(0.5)
        print("over")
        exit()
    
        # 总结: 主进程会等待所有的子进程执行完成以后程序再退出Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    执行结果:

    任务执行中...
    任务执行中...
    任务执行中...
    over
    任务执行中...
    任务执行中...
    任务执行中...
    任务执行中...
    任务执行中...
    任务执行中...
    任务执行中...Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    说明:

    通过上面代码的执行结果,我们可以得知: 主进程会等待所有的子进程执行结束再结束

    假如我们就让主进程执行0.5秒钟,子进程就销毁不再执行,那怎么办呢?

    • 我们可以设置守护主进程 或者 在主进程退出之前 让子进程销毁

    守护主进程:

    • 守护主进程就是主进程退出子进程销毁不再执行

    子进程销毁:

    • 子进程执行结束

    保证主进程正常退出的示例代码:

    import multiprocessing
    import time
    
    
    # 定义进程所需要执行的任务
    def task():
        for i in range(10):
            print("任务执行中...")
            time.sleep(0.2)
    
    if __name__ == '__main__':
        # 创建子进程
        sub_process = multiprocessing.Process(target=task)
        # 设置守护主进程,主进程退出子进程直接销毁,子进程的生命周期依赖与主进程
        # sub_process.daemon = True
        sub_process.start()
    
        time.sleep(0.5)
        print("over")
        # 让子进程销毁
        sub_process.terminate()
        exit()
    
        # 总结: 主进程会等待所有的子进程执行完成以后程序再退出
        # 如果想要主进程退出子进程销毁,可以设置守护主进程或者在主进程退出之前让子进程销毁Copy
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    执行结果:

    任务执行中...
    任务执行中...
    任务执行中...
    overCopy
    
    • 1
    • 2
    • 3
    • 4

    5. 主进程会等待所有的子进程执行结束再结束的小结

    • 为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行
    • 设置守护主进程方式: 子进程对象.daemon = True
    • 销毁子进程方式: 子进程对象.terminate()
  • 相关阅读:
    洛谷 P5682 [CSP-J2019 江西] 次大值
    【Seata】深入解读分布式事务解决方案
    从零开始 Spring Boot 25:MyBatis II
    SpringMVC中如何使用注解的方式实现文件上传呢?
    js 打开页面的方法总结
    背包问题学习笔记-二维费用的背包问题
    腾讯核心高级架构师汇总Java全栈知识点笔记,“吃透”后成功上岸!
    JavaWeb(三)
    LLaMA模型指令微调 字节跳动多模态视频大模型 Valley 论文详解
    Linux C 基于tcp多线程在线聊天室
  • 原文地址:https://blog.csdn.net/xianyu120/article/details/133386980