使用Python多進程共享全局變量的方法

Python多進程編程是在單個程序中使用多個並發執行序列的方法。可以創建子進程,每個子進程可以運行並執行操作。在使用多個並發執行序列的同時,共享全局變量是一個非常普遍的問題。在此文章中,我們將討論在Python多進程編程中共享全局變量的方法。

一、使用Manager對象共享全局變量

Manager對象是一個專為Python並發編程所設計的類,可以很容易地共享全局變量。使用Manager對象共享全局變量時,我們需要使用multiprocessing模塊中的Manager對象。


import multiprocessing

def worker(idx, val, dic):
    val.value += idx
    dic[idx] = val.value

if __name__ == "__main__":
    value = multiprocessing.Value('d', 0.0)
    dictionary = multiprocessing.Manager().dict()
    jobs = [multiprocessing.Process(target=worker, args=(idx, value, dictionary)) for idx in range(5)]

    for j in jobs:
        j.start()

    for j in jobs:
        j.join()

    print(dictionary.values())

在上述代碼中,我們創建了一個Manager對象,用於共享全局變量(dictionary)。將子進程交替運行,執行worker函數。在worker函數中,我們更新了val變量並在dictionary中記錄每個進程的狀態。

二、使用共享數組共享全局變量

共享數組允許我們在多個進程之間共享數據。使用共享數組共享全局變量時,需要使用Python中提供的共享內存。


import multiprocessing

def worker(idx, arr):
    arr[idx] = idx * idx

if __name__ == "__main__":
    arr = multiprocessing.Array('i', range(5))
    jobs = [multiprocessing.Process(target=worker, args=(idx, arr)) for idx in range(5)]
    for j in jobs:
        j.start()

    for j in jobs:
        j.join()

    print(arr[:])

在上述代碼中,我們創建了一個共享數組arr,在worker函數中更新數組arr的值,並在main函數中輸出數組的值。在這裡,我們只使用了一個數組,但是在更具體的應用中,可以使用多個共享數組來存儲複雜的數據結構。

三、使用共享鎖控制進程訪問

共享鎖可以用於在進程之間共享同步對象。當有多個進程嘗試同時訪問某一資源時,共享鎖可以保證其原子性。


import multiprocessing

def worker(val, lock):
    for i in range(5):
        with lock:
            print(val.value)
            val.value += 1

if __name__ == "__main__":
    val = multiprocessing.Value('i', 0)
    lock = multiprocessing.Lock()
    jobs = [multiprocessing.Process(target=worker, args=(val, lock)) for idx in range(5)]
    for j in jobs:
        j.start()

    for j in jobs:
        j.join()

在上述代碼中,我們使用了Val對象和Lock對象來共享變量和同步進程。在每個進程中,我們使用with語句來獲取鎖對象,確保同步的實現。這裡可以看到,輸出結果是原子性的。

四、使用共享隊列傳遞數據

另一種共享全局變量的方法是使用共享隊列進行數據傳遞。


import multiprocessing

def worker(q):
    for i in range(3):
        item = q.get()
        print(item)

if __name__ == "__main__":
    q = multiprocessing.Queue()
    jobs = [multiprocessing.Process(target=worker, args=(q,)) for idx in range(5)]
    for j in jobs:
        j.start()

    for j in jobs:
        q.put("hello")

    for j in jobs:
        j.join()

在上述代碼中,我們創建一個共享隊列,向隊列中發送數據並在每個進程中獲取數據。在使用共享隊列時,需要注意使用put和get方法進行隊列操作。

五、使用共享內存實現高速緩存

將數據存儲在共享內存中是實現高速緩存的一種有效方法。使用shelve模塊可以更好地實現共享內存。


import multiprocessing
import shelve

def worker(idx, cache):
    cache['key_%d' % idx] = idx

if __name__ == '__main__':
    cache = shelve.open('Cache', writeback=True)
    jobs = [multiprocessing.Process(target=worker, args=(idx, cache)) for idx in range(1000)]
    for j in jobs:
        j.start()

    for j in jobs:
        j.join()

    print(cache['key_0'], cache['key_1'], cache['key_999'])
    cache.close()

在上述代碼中,我們使用了shelve模塊將數據存儲在磁盤上的共享內存中。在每個進程中,我們使用shelve模塊對數據進行操作,確保數據存儲的正確性。在程序結束後,我們可以使用相同的鍵來檢索值。

六、總結:

Python多進程編程是一種方便且高效執行操作的方法,但是在共享全局變量時需要格外小心。在本文中,我們討論了使用Manager對象、共享數組、共享鎖、共享隊列和共享內存實現高速緩存的方法來共享全局變量。需要仔細研究不同的方法,並根據需要選擇最適合自己應用程序的方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/238271.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:10
下一篇 2024-12-12 12:10

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論