首页 >后端开发 >Python教程 >如何在 Python 多处理应用程序中的进程之间共享锁

如何在 Python 多处理应用程序中的进程之间共享锁

Barbara Streisand
Barbara Streisand原创
2024-10-17 10:52:02771浏览

How to Share Locks Between Processes in Python Multiprocessing Applications

使用 Python 跨进程共享锁

在多线程应用程序中,锁对于同步对共享资源的访问至关重要。然而,当这些进程分布在多个子进程中时,它们之间共享锁可能是一个挑战。

问题:

考虑一个利用 multiprocessing.Lock 的函数() 对象 (l) 管理对关键资源的访问。创建工作进程池 (pool) 和将锁作为参数传递的部分函数 (func) 后,尝试使用 pool.map() 在多个进程之间分配任务会导致运行时错误:“锁定对象只能通过继承在进程之间共享。”

缺少元素:

出现错误的原因是,默认情况下,Python 无法安全地pickle 常规 multiprocessing.Lock() 实例

解决方案:

要克服此限制并成功跨进程共享锁,存在两种可行的方法:

  1. 使用 Manager 对象:

    • 创建一个 multiprocessing.Manager() 实例 (m) 并传递一个 Manager.Lock(),它允许安全数据共享进程之间。
    • 由于需要外部管理器进程和 IPC,此方法引入了额外的开销。
  2. 在创建池时传递锁:

    • 使用初始化器 kwarg 在池初始化时传递常规 multiprocessing.Lock() (l)。
    • 这使得锁实例在所有子进程中全局可访问,消除对部分函数的需要。

代码示例(使用第二种解决方案):

<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn