我有两个python程序,它们应该并行运行并执行相同的操作:
正如您所看到的那样,最好是两个实例的执行以这样的方式同步:一种是处理重的步骤1和2(实现是多线程的,所以CPU实际上可以最大),而另一种则是I/O重的步骤3,反之亦然。
我的第一个想法是使用锁文件,每个进程在进入第3阶段时都会获得锁文件,并在完成后释放。因此,另一个进程将等待锁被释放,然后在它进入第三阶段时设置它。然而,这似乎是一个非常麻烦的方法。此外,该系统应该在几天或几周内不受监督地运行,能够从错误、计划中的重启或电源故障中恢复。特别是在最后一种情况下,锁文件可以简单地锁住所有的东西。
是否有一种更优雅的方式来沟通这两个进程之间的锁定?还是我应该使用锁文件并尝试实现一些智能清理功能来防止死锁的发生?
发布于 2021-02-01 12:31:40
似乎每种解决方案都有一些缺点--有些机制或模块不是在所有平台上都可用(即仅Linux或Windows ),或者您可能会遇到基于文件系统的方法的错误恢复问题(正如您在问题中已经指出的那样)。
下面列出了一些可能的选择:
使用Python的multiprocessing模块
这允许您创建这样的锁:
lock = multiprocessing.Lock()然后像这样获得和释放它:
lock.acquire()
# do something
lock.release() 这是是一个完整的例子。
Pro:简单易用;跨平台;无错误恢复问题。
Con:,因为您目前有两个独立的程序,所以您必须重新排列代码,以便从同一个python模块启动两个进程。
使用fnctl (Linux)
对于Linux/Unix系统,有fcntl (带有fcntl.flock())可以作为python模块使用。这是基于锁文件。
请参见这一讨论中的一些建议,我在这里重复如下:
Con:不是跨平台的,只能在Linux/Unix系统上使用。
使用posix_ipc (Linux)
对于Linux/Unix系统,ipc (带有Semaphore类)可以作为python模块使用。
Pro:不基于文件系统,没有错误恢复问题.
Con:不是跨平台的,只能在Linux/Unix系统上使用。
使用msvcrt (Windows)
对于Windows,有msvcrt (带有msvcrt.locking())可以作为python模块使用。
另见这一讨论。
Con:不跨平台,仅适用于Windows .
使用第三方库
您可能需要查看以下python库:
https://stackoverflow.com/questions/65950335
复制相似问题