多进程知识简单总结

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

1、代码展现

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
接收完毕...

2、总结

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

    • ※:这是由于每建立一个进程就会 copy 一份原始代码(全局变量仍是初值)给本身使用,因此进程间的代码是同样的,但 变量和数据是独立
  • ② 各个进程间能够经过 Queue 建立的队列来传递变量,列表,字符串值(包括全局变量的值)函数

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

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

    • ① 进程 包含 多个线程
    • ② 进程间 不共用 变量与资源;线程间 共用 变量与资源
    • ③ 使用 time.sleep() ,能够停下当前的进程,让其余进程开始工做
相关文章
相关标签/搜索