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


一、代码展示

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() ,可以停下当前的进程,让其他进程开始工作


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM