gpt4 book ai didi

python - 在进程之间传递资源锁的最佳方式

转载 作者:行者123 更新时间:2023-12-05 02:45:33 25 4
gpt4 key购买 nike

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

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

如您所见,如果能以一种执行处理器密集型步骤 1 和 2 的方式同步两个实例的执行会很好(实现是多线程的,因此 CPU 实际上可以最大化)同时另一个执行 I/O 密集型步骤 3,反之亦然。

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

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

最佳答案

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

这里是一些可能选项的列表:

使用Python的multiprocessing模块

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

lock = multiprocessing.Lock()

并像这样获取和释放它:

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

Here is一个完整的例子。

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

缺点:由于您目前有两个独立的程序,因此您必须重新安排代码以从同一个 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 库:

关于python - 在进程之间传递资源锁的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65950335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com