【发布时间】: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是相关的),是否有最常见的方法来实现这一点。
标签: python linux multiprocessing pthreads python-multiprocessing