首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程之间通信资源锁的最佳方法

进程之间通信资源锁的最佳方法
EN

Stack Overflow用户
提问于 2021-01-29 07:27:26
回答 2查看 338关注 0票数 3

我有两个python程序,它们应该并行运行并执行相同的操作:

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

正如您所看到的那样,最好是两个实例的执行以这样的方式同步:一种是处理重的步骤1和2(实现是多线程的,所以CPU实际上可以最大),而另一种则是I/O重的步骤3,反之亦然。

我的第一个想法是使用锁文件,每个进程在进入第3阶段时都会获得锁文件,并在完成后释放。因此,另一个进程将等待锁被释放,然后在它进入第三阶段时设置它。然而,这似乎是一个非常麻烦的方法。此外,该系统应该在几天或几周内不受监督地运行,能够从错误、计划中的重启或电源故障中恢复。特别是在最后一种情况下,锁文件可以简单地锁住所有的东西。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-01 12:31:40

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

下面列出了一些可能的选择:

使用Python的multiprocessing模块

这允许您创建这样的锁:

代码语言:javascript
复制
lock = multiprocessing.Lock()

然后像这样获得和释放它:

代码语言:javascript
复制
lock.acquire() 
# do something
lock.release() 

这是是一个完整的例子。

Pro:简单易用;跨平台;无错误恢复问题。

Con:,因为您目前有两个独立的程序,所以您必须重新排列代码,以便从同一个python模块启动两个进程。

使用fnctl (Linux)

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

请参见这一讨论中的一些建议,我在这里重复如下:

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

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库:

票数 4
EN

Stack Overflow用户

发布于 2021-02-01 11:07:16

如果您运行时存在一些同步问题,在我看来,没有比使用信号量更好的方法了。您处理清理和锁部件的方式在很大程度上取决于您的问题。这类问题有很多资源。Python已经实现了一些原语

您可以检查这个帖子作为一个示例。

另外,请检查动物园管理员,我从不在python上使用它,但它在其他语言中被广泛使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65950335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档