有没有什么简单的方法可以在Linux上用Python实现系统范围的互斥?我所说的"系统范围",是指互斥锁将由一组Python processes使用;这与传统的互斥不同,在同一进程中,threads人使用传统的互斥.

编辑:我不确定Python的multiprocessing包是否是我需要的.例如,我可以在两个不同的解释器中执行以下操作:

from multiprocessing import Lock
L = Lock()
L.acquire()

当我在两个独立的解释器中同时执行这些命令时,我希望其中一个挂起.相反,两者都不挂;看起来他们没有获得相同的互斥.

推荐答案

"传统的"Unix解决方案是使用文件锁.您可以使用lockf(3)锁定文件的部分,以便其他进程无法编辑它;一种非常常见的滥用是将其用作进程之间的互斥.python的等效值是fcntl.lockf.

传统上,您会将锁定进程的PID写入锁文件,这样,由于进程在持有锁时死亡而导致的死锁是可以识别和修复的.

这可以满足您的需求,因为您的锁位于全局命名空间(文件系统)中,所有进程都可以访问.这种方法还有一个好处,即非Python程序可以参与锁定.缺点是你需要一个地方来存放这个锁文件;此外,有些文件系统实际上没有正确锁定,因此有可能无法实现排除.你赢了一些,你输了一些.

Linux相关问答推荐

C++17:G++8.5版似乎无法正确生成无符号64位伪随机整数

是否可以在Bash正则表达式中排除?

IntelliJ(PyCharm)不再识别Linux中的AltGr快捷键

一个关于Linux中的fork()和物理地址的奇怪问题

X86 程序集 - struct 点 - 存储/返回不正确?

如何比较 2 个文件并将第二个文件的所有行打印到输出文件 awk

erlang 格式的 utf8 变为 \x(反斜杠 x)ascii 编码

在 bash 中解析变量

如何判断 Linux 机器是否支持 AVX/AVX2 指令?

如何使用 __attribute__((visibility("default")))?

pthread_exit 与返回

为什么两次使用 grep 时没有显示输出?

从bash中的字符串中删除所有特殊字符和大小写

在文件夹中的 gzip 文件中查找字符串

在 Linux / Mono 上运行 ServiceStack 的最佳方式是什么?

bash / Makefile中双美元符号的含义是什么?

更改 /etc/profile 后,我需要做什么来重置我的 shell?

Linux cmd 在 jar 中搜索类文件,而不考虑 jar 路径

libaio.so.1:无法打开共享对象文件

在 bash 脚本中使用备用屏幕