Python 在进程之间传递资源锁的最佳方式
我有两个python程序,它们应该并行运行并执行相同的操作:Python 在进程之间传递资源锁的最佳方式,python,process,Python,Process,我有两个python程序,它们应该并行运行并执行相同的操作: 从磁盘读取和解压缩数据(大约需要1分钟) 过程数据(大约需要2-3分钟) 将数据发送到数据库(大约需要3-5分钟) 如您所见,以一种方式同步两个实例的执行将是很好的,一个执行处理器繁重的步骤1和2(实现是多线程的,因此CPU实际上可以最大化),而另一个执行I/O繁重的步骤3,反之亦然 我的第一个想法是使用锁文件,每个进程在进入第3阶段时都会获取锁文件,并在完成后发布。因此,另一个进程将等待锁释放,然后在进入第3阶段时进行设置。然而,这
有没有更优雅的方式来沟通两个进程之间的锁定?或者我应该使用lockfile并尝试实现一些智能清理功能来防止死锁发生?如果您在运行时遇到一些同步问题,我认为没有比使用信号量更好的方法了。处理清理和锁部件的方式在很大程度上取决于您的问题。这类问题有很多资源。Python已经实现了一些 您可以查看此示例
另外请注意,我从未在python上使用过它,但它在其他语言中被广泛使用。似乎每种解决方案都有一些缺点-某些机制或模块并非在所有平台上都可用(即仅限Linux或仅限Windows),或者使用基于文件系统的方法可能会遇到错误恢复问题(正如你在问题中已经指出的那样) 以下是一些可能选项的列表: 使用Python的
多处理
模块
这允许您创建如下所示的锁:
lock = multiprocessing.Lock()
lock.acquire()
# do something
lock.release()
并且像这样获取和发布它:
lock = multiprocessing.Lock()
lock.acquire()
# do something
lock.release()
一个完整的例子
Pro:使用简单;跨平台;错误恢复没有问题
Con:由于您当前有两个独立的程序,因此必须重新排列代码,以便从同一个python模块启动两个进程
使用fnctl
(Linux)
对于Linux/Unix系统,有(带有fcntl.flock()
)作为python模块提供。这是基于锁文件的
另请参见我在此重复的一些建议:
- 将锁定进程的进程ID写入文件,以便能够识别和修复可能的死锁
- 将锁定文件放在临时位置或RAM文件系统中
信号量
类)
Pro:不基于文件系统,错误恢复没有问题
Con:不跨平台,仅在Linux/Unix系统上可用
使用msvcrt
(Windows)
对于Windows系统,有(带有msvcrt.locking()
)作为python模块提供
另见
缺点:不跨平台,仅在Windows系统上可用
使用第三方库
您可能希望查看以下python库: