任意进程的python进程间互斥锁

Posted

技术标签:

【中文标题】任意进程的python进程间互斥锁【英文标题】:python inter-process mutex for arbitrary processes 【发布时间】:2021-08-13 23:26:38 【问题描述】:

我需要mutexlinux 主机上运行python 的多个进程。

它们的进程不是以我控制的方式产生的(要清楚,它们是我的代码),所以我不能使用multithreading.Lock,至少据我了解。正在同步的资源是对两个独立的内部服务的一系列读/写操作,这些服务是旧的、有状态的、不是为并发/事务访问而设计的,并且超出了修改的范围。

我熟悉但目前被拒绝的几种方法:

在本机代码中使用shmget / pthread_mutex_lock(例如,在操作系统提供的共享内存中,通过众所周知的字符串名称创建pthread 互斥锁)。我希望不必为此使用/添加 ctypes 包装器(或者理想情况下,此高级应用程序在此处完全可见任何低级构造)。 使用lock file 库之一,例如fasteners 可以工作 - 但要求任何特定 文件系统访问是很尴尬的(库/方法可以在后台稳健地使用它,但理想情况下我的客户端代码就是从中抽象出来的)。

有没有首选的方式在 python 中完成这个(在 linux 下;跨平台的奖励积分)?

【问题讨论】:

我建议添加一些有关您的流程的背景信息。这些流程会做什么?哪些资源需要锁定以防止并发访问? 下一个想到的方法是在 Python 代码中使用队列或管道/套接字?让进程等待,直到监视线程通过通信系统发送任务。这不可能吗? 使用命名信号量:pypi.org/project/posix-ipc here's 一个windows信号量的包装器,不过我个人没用过…… @Aaron - 看起来很有希望,我会试一试。可能是答案的候选者(虽然这是一个非常小的项目,但我的问题有一个组成部分,即在进程池之外(multiprocessing.Lock 是相关的),是否有最常见的方法来实现这一点。 【参考方案1】:

同步非子进程的选项:

    Use a remote manager。我对这个过程不是很熟悉,但文档至少有一个简单的例子。

    使用您自己的协议(而不是管理器)创建一个简单的服务器:类似于环回地址上的套接字服务器,用于弹回简单的消息。

    使用文件系统:https://pypi.org/project/filelock/

    在 posix 兼容系统上,有一个相当简单的 IPC 结构包装器 posix-ipc。我还找到了一个wrapper for windows semaphores,但它并不是那么简单(虽然也不是很难)。在这两种情况下,您的程序都将使用众所周知的字符串“名称”来访问/创建互斥锁。在这两种情况下,都需要小心/错误检查来正确处理互斥体的创建(参见O_CREX flag...之类的内容)

【讨论】:

以上是关于任意进程的python进程间互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

提升进程间共享互斥锁和提升共享互斥锁的进程间条件变量

python并发编程之多进程1------互斥锁与进程间的通信

Python多进程,同步互斥,信号量,锁补充上一篇文章

pthread mutex 进程间互斥锁

31互斥锁与进程间通信

Linux进程间通信(互斥锁、条件变量、读写锁、文件锁、信号灯)