進程之間不共享全局變量


 

 

 

一、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()
View Code

 

執行結果:

 

 

 

 

四、進程之間不共享全局變量——調用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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM