当尝试使用 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中文网其他相关文章!