首頁  >  文章  >  後端開發  >  如何使用多處理在 Python 中的進程之間共享鎖

如何使用多處理在 Python 中的進程之間共享鎖

Linda Hamilton
Linda Hamilton原創
2024-10-17 11:12:02913瀏覽

How to Share a Lock Between Processes in Python Using Multiprocessing

在Python 中的進程之間共享鎖定

當嘗試使用pool.map() 來定位具有多個參數(包括Lock() 物件)的函數時,它是對於解決子進程之間共享鎖的問題至關重要。由於 pickling 的限制,傳統的 multiprocessing.Lock() 無法直接傳遞給 Pool 方法。

選項 1:使用 Manager 和 Manager.Lock()

一種方法是利用 Manager()並實例化一個 Manager.Lock()。雖然此方法很可靠,但由於託管 Manager 伺服器的額外進程,它會涉及更多開銷。此外,鎖定操作需要透過 IPC 與此伺服器進行通訊。

選項 2:使用初始化器在建立池時傳遞鎖定

或者,您可以在池初始化期間使用常規 multiprocessing.Lock() 傳遞初始化關鍵字參數。這確保了鎖實例在所有子程序中都是全域的。此方法消除了部分功能的必要性並簡化了流程。

這是使用選項 2 的範例:

<code class="python">def target(iterable_item):
    for item in items:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def init(l):
    global lock
    lock = l

def main():
    iterable = [1, 2, 3, 4, 5]
    l = multiprocessing.Lock()
    pool = multiprocessing.Pool(initializer=init, initargs=(l,))
    pool.map(target, iterable)
    pool.close()
    pool.join()</code>

以上是如何使用多處理在 Python 中的進程之間共享鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn