一、代碼展示
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() ,可以停下當前的進程,讓其他進程開始工作