當嘗試使用pool.map() 來定位具有多個參數(包括Lock() 物件)的函數時,它是對於解決子進程之間共享鎖的問題至關重要。由於 pickling 的限制,傳統的 multiprocessing.Lock() 無法直接傳遞給 Pool 方法。
一種方法是利用 Manager()並實例化一個 Manager.Lock()。雖然此方法很可靠,但由於託管 Manager 伺服器的額外進程,它會涉及更多開銷。此外,鎖定操作需要透過 IPC 與此伺服器進行通訊。
或者,您可以在池初始化期間使用常規 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中文網其他相關文章!