一、global關鍵字:
在函數中定義的變量如果加上global關鍵字,則表示要聲明修改全局變量的內存地址。
二、原因:
創建的子進程會對主進程的資源進行拷貝。創建的子進程實際上就是主進程的一個副本。
(資源包含:代碼、分配的內
存等)
三、進程之間不共享全局變量——未調用join方法

from multiprocessing import Process from time import * g_list = list() # 定義全局變量 def add_data(): """添加數據任務""" for i in range(3): """ 列表是可變類型,可以在原有的內存基礎上修改數據,且修改后內存地址不變, 所以不需要加上global關鍵字。 """ g_list.append(i) print("add:", i) sleep(0.2) print("添加的數據為:", g_list) def read_data(): """讀取數據任務""" print("read",g_list) p1 = Process(target=add_data) p2 = Process(target=read_data) p1.start() p2.start()
執行結果:
四、進程之間不共享全局變量——調用join方法
from multiprocessing import Process from time import * g_list = list() # 定義全局變量 def add_data(): """添加數據任務""" for i in range(3): """ 列表是可變類型,可以在原有的內存基礎上修改數據,且修改后內存地址不變, 所以不需要加上global關鍵字。 """ g_list.append(i) print("add:", i) sleep(0.2) print("添加的數據為:", g_list) def read_data(): """讀取數據任務""" print("read",g_list) p1 = Process(target=add_data) p2 = Process(target=read_data) p1.start() p1.join() # 表示主進程等待p1子進程添加完數據后再繼續往下執行 p2.start()
執行結果:
五、Windows系統的BUG
1、問題:此BUG只會發生在Windows系統中。即:創建子進程后,子進程除了會拷貝主進程的代碼外,還會拷貝主進程的執行代碼。從而導致了無限遞歸的錯誤。
2、解決:
通過判斷主否為主模塊來解決此BUG。
if __name__ == '__main__':
pass
3、if__name__ == '__main__':的兩大作用:
防止別人導入你的模塊
防止創建子進程后,子進程會拷貝主進程的代碼外,還會拷貝主進程的執行代碼,導致無限遞歸創建子進程錯誤
Windows中多進程Bug演示:
from multiprocessing import * from time import * g_list = list() # 定義全局變量 def add_data(): """添加數據任務""" for i in range(3): g_list.append(i) print("add:", i) sleep(0.2) print("添加的數據為:", g_list) def read_data(): """讀取數據任務""" print("read", g_list) if __name__ == "__main__": p1 = Process(target=add_data) # 創建添加數據子進程 p2 = Process(target=read_data) # 創建讀取數據子進程 p1.start() p1.join() p2.start()