任意进程的python进程间互斥锁
Posted
技术标签:
【中文标题】任意进程的python进程间互斥锁【英文标题】:python inter-process mutex for arbitrary processes 【发布时间】:2021-08-13 23:26:38 【问题描述】:我需要mutex
在linux
主机上运行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进程间互斥锁的主要内容,如果未能解决你的问题,请参考以下文章