我正在使用 celery 和 zookeeper (kazoo lock) 来锁定我的工人。当我在释放锁之前杀死(-9)一名工作人员时,我遇到了一个问题,然后该锁将永远保持锁定状态。
所以我的问题是:杀死进程是否会释放该进程中的锁,或者这是zookeeper中的一些错误?
我正在使用 celery 和 zookeeper (kazoo lock) 来锁定我的工人。当我在释放锁之前杀死(-9)一名工作人员时,我遇到了一个问题,然后该锁将永远保持锁定状态。
所以我的问题是:杀死进程是否会释放该进程中的锁,或者这是zookeeper中的一些错误?
Zookeeper锁使用临时节点。临时节点是一个节点,只要创建它的会话还活着,它就会一直存在。会话通过创建会话的进程定期向 Zookeeper 发送心跳消息来保持活动状态。
因此,如果您杀死创建锁的进程,锁最终将被释放,因为会话将随着 Zookeeper 不再接收心跳而终止。
所以在释放锁之前杀死一个工人应该最终释放锁。
如果锁从未被释放,可能会发生一些事情,
这不太可能是 zookeeper 错误。
你怎么知道锁没有被释放?
使用终止信号终止进程不会清除“软件锁”,例如 ZooKeeper 锁。
被 KILL 信号杀死的唯一类型的锁是操作系统级别的锁,因为所有文件描述符都被杀死,因此文件描述符锁也被杀死。但就 ZooKeeper 而言,这些不是操作系统级别的锁(仅仅是因为 ZooKeeper 进程,即使在同一台机器上,也不是你的 python 进程之一)。
因此,这不是 ZooKeeper 中的错误,也是您 kill -9 的预期行为。