• 多进程知识简单总结


    多进程间的全局变量不共享

    一、代码展示

    import multiprocessing as mul_p
    import time
    
    egg1 = 1
    
    
    def write(egg2, q):
    
        global egg1
        print("write全局变量彩蛋[%s]..." % egg1)
        print("write彩蛋[%s]..." % egg2)
        egg1 -= 1
        print("write全局变量彩蛋[%s]...原来的彩蛋[1]" % egg1)
    
        # 将修改后的彩蛋1的值放入队列中去
        q.put(egg1)
    
    
    def read(egg2, q):
    
        global egg1
        print("read全局变量彩蛋[%s]..." % egg1)
        print("read彩蛋[%s]..." % egg2)
    
        while True:
    
            # 从队列中取出 p1 子进程中的 全局变量彩蛋1 的值
            egg1 = q.get()
            print("read接收到的write中的全局变量彩蛋[1]的值:%d" % egg1)
            if q.empty():
                print("接收完毕...")
                break
    
    
    def main():
    
        # 假设连个进程都需要打印下面这个彩蛋2
        egg2 = 2
    
        # ① 创建一个队列,可以不填,队列就可以很大,但有个极限,我们不去考虑它
        #   如果填了数字为 x ,则这个队列可以存储 x 个数据
        q = mul_p.Queue()
    
        # ② 创建两个进程对象
        p1 = mul_p.Process(target=write, args=(egg2, q,))
        p2 = mul_p.Process(target=read, args=(egg2, q,))
    
        # ③ 让两个子进程开始工作
        p1.start()
        # 先让主进程 休息1s 让 p1 子进程先执行完,不然两个子进程 争着执行 打印输出会乱套
        time.sleep(1)
        p2.start()
    
    
    if __name__ == "__main__":
        main()
    

    运行结果:

    write全局变量彩蛋[1]...
    write彩蛋[2]...
    write全局变量彩蛋[0]...原来的彩蛋[1]
    read全局变量彩蛋[1]...
    read彩蛋[2]...
    read接收到的write中的全局变量彩蛋[1]的值:0
    接收完毕...
    

    二、总结

    • ① 各个进程间全局变量的值是 不共享

      • ※:这是因为每创建一个进程就会 copy 一份原始代码(全局变量还是初值)给自己使用,所以进程间的代码是一样的,但 变量和数据是独立
    • ② 各个进程间可以通过 Queue 创建的队列来传递变量,列表,字符串值(包括全局变量的值)

    • ③ 每个进程任务里的参数,除了 全局变量(函数局部变量),其余的参数都需要通过外部实参,传入到内部形参。

      • ※:尤其是上例程的 队列 q 要作为 实参传给两个进程,这样才能实现两个进程间的通信。
    • 进程与线程之间的关系与区别:

      • ① 进程 包含 多个线程
      • ② 进程间 不共用 变量与资源;线程间 共用 变量与资源
      • ③ 使用 time.sleep() ,可以停下当前的进程,让其他进程开始工作
  • 相关阅读:
    Springboot 基于的SAP项目环境配置
    Impala 技术点梳理
    Elasticsearch 使用技巧笔记
    ELK 6.x 部署
    eclipse安装lombok
    IIS服务器管理学习
    Springboot依赖注入笔记
    Eclipse解决乱码问题
    Springboot依赖注入 Service类中使用静态变量
    javascript 操作符类型隐性转换
  • 原文地址:https://www.cnblogs.com/fry-hell/p/12818477.html
Copyright © 2020-2023  润新知