进程死亡时消失的 Python 锁

Posted

技术标签:

【中文标题】进程死亡时消失的 Python 锁【英文标题】:Python locks that go away when process dies 【发布时间】:2012-01-11 16:42:33 【问题描述】:

是否有任何 Python 的锁定接口可以在进程终止时自动打破锁定?我的印象是 sysv ipc 允许这样做,但我仍在尝试找出细节。

我对界面的期望:

锁定/释放函数 在 Linux 上的不同进程之间工作 当持有锁的进程死亡时自动解锁 超时时强制中断锁(非必要)

【问题讨论】:

【参考方案1】:

您可以使用fcntl.lockffcntl.flock 对文件应用锁定。这似乎符合您的所有标准。或者您是否需要在每次想要锁定或解锁时都不需要系统调用的东西?

【讨论】:

【参考方案2】:

我通常使用 try ... finally 块来释放锁。 例如

try:
    #do stuff
except Exception:
    pass
finally:
    #release lock

【讨论】:

【参考方案3】:

您可以尝试内置 multiprocessing 包中的 Lock 对象。我不确定当进程被垃圾回收时锁是否会自动解锁,但你总是可以像这样子类multiprocessing.Process

class MyProc(multiprocessing.Process):
    def __init__(self):
        self.ipc_lock = multiprocessing.Lock()
        # ...
        return
    def __del__(self):
        self.ipc_lock.release()
        return

如果您需要在触发异常时解锁,则将其放入(覆盖的)run 方法中。

【讨论】:

以上是关于进程死亡时消失的 Python 锁的主要内容,如果未能解决你的问题,请参考以下文章

确保子进程在退出 Python 程序时死亡

当父进程死亡时,如何杀死使用 subprocess.check_output() 创建的 python 子进程?

Erlang:控制Erlang进程崩溃时如何使连接的外部OS进程自动死亡?

当pexpect会话结束时,进程会死亡

Apache zeppelin 进程死亡

QProcess::startDetached shell 在父进程死亡时被杀死,如果父进程是一个 systemd 服务