多進程知識簡單總結

多進程間的全局變量不共享

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() ,能夠停下當前的進程,讓其餘進程開始工做
相關文章
相關標籤/搜索