python 任意进程的进程间互斥
python inter-process mutex for arbitrary processes
我需要在 linux
主机上 mutex
多个进程 运行 python
。
它们的进程不是以我控制的方式产生的(明确地说,它们是我的代码),所以我不能使用 multithreading.Lock
,至少据我所知是这样。正在同步的资源是一系列 reads/writes 到两个单独的内部服务,这些服务是旧的、有状态的、不是为 concurrent/transactional 访问而设计的,并且超出了修改范围。
一些我熟悉但到目前为止被拒绝的方法:
- 在本机代码中使用
shmget
/ pthread_mutex_lock
(例如,在 OS 提供的共享内存中,通过众所周知的字符串名称创建 pthread
互斥体)。我希望不必为此 use/add 一个 ctypes
包装器(或者理想情况下,对于这个高级应用程序,任何低级构造在这里都可见)。
- 使用
lock file
库之一,例如 fasteners
可以工作 - 但需要任何 特定的 文件系统访问是尴尬的(library/approach 可以在引擎盖下稳健地使用它,但理想情况下我的客户端代码是从中抽象出来的)。
在 python 中(在 linux 下;跨平台加分)是否有更好的方法来完成此操作?
同步非子进程的选项:
Use a remote manager。我不是很熟悉这个过程,但文档至少有一个简单的例子。
使用您自己的协议(而不是管理器)创建一个简单的服务器:类似于环回地址上的套接字服务器,用于在周围弹回简单消息。
-
在 posix 兼容系统上,有一个相当简单的 IPC 构造包装器 posix-ipc. I also found a wrapper for windows semaphores,但它并不那么简单(尽管按说也不难)。在这两种情况下,您的程序都将使用众所周知的字符串“name”来访问/创建互斥锁。在这两种情况下,都需要注意/错误检查以正确处理互斥体的创建(参见 O_CREX
标志...)
我需要在 linux
主机上 mutex
多个进程 运行 python
。
它们的进程不是以我控制的方式产生的(明确地说,它们是我的代码),所以我不能使用 multithreading.Lock
,至少据我所知是这样。正在同步的资源是一系列 reads/writes 到两个单独的内部服务,这些服务是旧的、有状态的、不是为 concurrent/transactional 访问而设计的,并且超出了修改范围。
一些我熟悉但到目前为止被拒绝的方法:
- 在本机代码中使用
shmget
/pthread_mutex_lock
(例如,在 OS 提供的共享内存中,通过众所周知的字符串名称创建pthread
互斥体)。我希望不必为此 use/add 一个ctypes
包装器(或者理想情况下,对于这个高级应用程序,任何低级构造在这里都可见)。 - 使用
lock file
库之一,例如fasteners
可以工作 - 但需要任何 特定的 文件系统访问是尴尬的(library/approach 可以在引擎盖下稳健地使用它,但理想情况下我的客户端代码是从中抽象出来的)。
在 python 中(在 linux 下;跨平台加分)是否有更好的方法来完成此操作?
同步非子进程的选项:
Use a remote manager。我不是很熟悉这个过程,但文档至少有一个简单的例子。
使用您自己的协议(而不是管理器)创建一个简单的服务器:类似于环回地址上的套接字服务器,用于在周围弹回简单消息。
在 posix 兼容系统上,有一个相当简单的 IPC 构造包装器 posix-ipc. I also found a wrapper for windows semaphores,但它并不那么简单(尽管按说也不难)。在这两种情况下,您的程序都将使用众所周知的字符串“name”来访问/创建互斥锁。在这两种情况下,都需要注意/错误检查以正确处理互斥体的创建(参见
O_CREX
标志...)