【问题标题】:Best way to communicate resource lock between processes在进程之间通信资源锁的最佳方式
【发布时间】:2021-01-29 07:27:26
【问题描述】:

我有两个 python 程序应该并行运行并做同样的事情:

  1. 从磁盘读取和解压缩数据(大约需要 1 分钟)
  2. 处理数据(大约需要 2-3 分钟)
  3. 将数据发送到数据库(大约需要 3-5 分钟)

如您所见,最好让两个实例的执行以一种执行大量处理器的步骤 1 和 2 的方式同步(实现是多线程的,因此 CPU 实际上可以最大化),而另一个执行 I/O 繁重的第 3 步,反之亦然。

我的第一个想法是使用锁文件,每个进程在进入阶段 3 时获取并在完成后释放。所以其他进程会一直等到锁被释放,然后在进入阶段3的时候再设置。然而,这似乎是一种非常繁琐的做法。此外,系统应该在无人监督的情况下运行数天和数周,并能够从错误、计划重启或电源故障中恢复。特别是在最后一种情况下,锁定文件可以简单地锁定所有内容。

有没有更优雅的方式来传达两个进程之间的锁定?还是我应该使用锁定文件并尝试实现一些智能清理功能以防止发生死锁?

【问题讨论】:

    标签: python process


    【解决方案1】:

    似乎每个解决方案都有一些缺点 - 某些机制或模块并非在所有平台上都可用(即仅 Linux 或仅 Windows),或者您可能会遇到基于文件系统的方法的错误恢复问题(如您已经在您的问题中指出)。

    这里列出了一些可能的选项:

    使用 Python 的 multiprocessing 模块

    这允许您像这样创建一个锁:

    lock = multiprocessing.Lock()
    

    并像这样获取和释放它:

    lock.acquire() 
    # do something
    lock.release() 
    

    Here is 一个完整的例子。

    专业版:使用简单;跨平台;错误恢复没有问题。

    缺点:由于您目前有两个独立的程序,因此您必须重新排列代码以从同一个 python 模块启动两个进程。

    使用fnctl (Linux)

    对于 Linux/Unix 系统,fcntl(带有fcntl.flock())可用作 python 模块。这是基于锁定文件的。

    另请参阅 this discussion 以及我在此重复的一些建议:

    • 将锁定进程的进程 ID 写入文件,以便能够识别和修复可能的死锁。
    • 将锁定文件放在临时位置或 RAM 文件系统中。

    缺点:不跨平台,仅适用于 Linux/Unix 系统。

    使用posix_ipc (Linux)

    对于 Linux/Unix 系统,python_ipc(带有 Semaphore 类)可用作 python 模块。

    专业人士:不基于文件系统,没有错误恢复问题。

    缺点:不跨平台,仅适用于 Linux/Unix 系统。

    使用msvcrt (Windows)

    对于 Windows 系统,msvcrt(带有msvcrt.locking())可用作 python 模块。

    另见this discussion。

    缺点:不跨平台,仅适用于 Windows 系统。

    使用第三方库

    您可能想查看以下 python 库:

    【讨论】:

    • 谢谢,“filelock”库似乎是我想要的。但是,我必须弄清楚我必须在哪里放置锁定检查,以便它对性能的影响最小......
    【解决方案2】:

    如果您遇到一些同步问题,我认为没有比使用信号量更好的方法了。您处理清理和锁定部件的方式很大程度上取决于您的问题。这类问题有很多资源。 Python 已经实现了一些primitives

    您可以查看post 的示例。

    还要检查Zookeeper,我从不在python上使用它,但它在其他语言中广泛使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 2015-08-10
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多