【问题标题】:python inter-process mutex for arbitrary processes任意进程的python进程间互斥锁
【发布时间】: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 是相关的),是否有最常见的方法来实现这一点。

标签: python linux multiprocessing pthreads python-multiprocessing


【解决方案1】:

同步非子进程的选项:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2010-11-05
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    相关资源
    最近更新 更多