使用 Python 跨进程共享锁
在多线程应用程序中,锁对于同步对共享资源的访问至关重要。然而,当这些进程分布在多个子进程中时,它们之间共享锁可能是一个挑战。
问题:
考虑一个利用 multiprocessing.Lock 的函数() 对象 (l) 管理对关键资源的访问。创建工作进程池 (pool) 和将锁作为参数传递的部分函数 (func) 后,尝试使用 pool.map() 在多个进程之间分配任务会导致运行时错误:“锁定对象只能通过继承在进程之间共享。”
缺少元素:
出现错误的原因是,默认情况下,Python 无法安全地pickle 常规 multiprocessing.Lock() 实例
解决方案:
要克服此限制并成功跨进程共享锁,存在两种可行的方法:
使用 Manager 对象:
在创建池时传递锁:
代码示例(使用第二种解决方案):
<code class="python">from multiprocessing import Pool, Lock def init(l): global lock lock = l def target(iterable_item): # Access shared resources using lock def main(): l = Lock() pool = Pool(initializer=init, initargs=(l,)) pool.map(target, iterable) pool.close() pool.join()</code>
通过以下方法,您可以有效地在进程之间共享锁,从而实现分布式 Python 应用程序中的同步和数据共享。
以上是如何在 Python 多处理应用程序中的进程之间共享锁的详细内容。更多信息请关注PHP中文网其他相关文章!