我正在使用celery 和Zookeeper(卡祖笛锁)来锁定我的工人。我有一个问题,当我杀死(-9)一个工人之前释放锁,然后锁永远锁定。所以我的问题是:杀死进程会释放该进程中的锁吗?还是这是zookeeper中的某个bug?
rjzwgtxy1#
Zookeeper锁使用临时节点。临时节点是指只要创建它的会话处于活动状态,它就一直处于活动状态的节点。通过创建会话的进程定期向Zookeeper发送心跳消息,会话就一直处于活动状态。因此,如果您终止创建锁的进程,锁最终将被释放,因为会话将因zookeeper不再接收心跳而死亡。因此,在释放锁之前杀死一个工作线程应该最终释放锁。如果锁一直没有打开,可能会发生一些事情,1.其他人注意到锁被释放并获得了它。可能您锁定锁是因为存在争用,并且其他进程将尝试在锁被释放时获得它。1.您等待的时间不够长。当您连接到zookeeper时,应该设置一个会话超时参数,即服务器在没有听到任何心跳的情况下保持会话活动的时间,您必须等待这么长时间才能看到锁被释放
n6lpvg4x2#
使用终止信号终止进程不会清除“软件锁”(如ZooKeeper锁)。唯一被KILL信号杀死的锁是操作系统级别的锁,因为所有的文件描述符都被杀死了,文件描述符锁也被杀死了。但是就ZooKeeper而言,这些锁不是操作系统级别的锁(仅仅是因为ZooKeeper进程,即使在同一台机器上,也不是你的python进程)。因此,这不是ZooKeeper中的bug,而是kill -9的预期行为。
2条答案
按热度按时间rjzwgtxy1#
Zookeeper锁使用临时节点。临时节点是指只要创建它的会话处于活动状态,它就一直处于活动状态的节点。通过创建会话的进程定期向Zookeeper发送心跳消息,会话就一直处于活动状态。
因此,如果您终止创建锁的进程,锁最终将被释放,因为会话将因zookeeper不再接收心跳而死亡。
因此,在释放锁之前杀死一个工作线程应该最终释放锁。
如果锁一直没有打开,可能会发生一些事情,
1.其他人注意到锁被释放并获得了它。可能您锁定锁是因为存在争用,并且其他进程将尝试在锁被释放时获得它。
1.您等待的时间不够长。当您连接到zookeeper时,应该设置一个会话超时参数,即服务器在没有听到任何心跳的情况下保持会话活动的时间,您必须等待这么长时间才能看到锁被释放
这不太可能是Zookeeper的错误。
你怎么知道锁没有被打开?
n6lpvg4x2#
使用终止信号终止进程不会清除“软件锁”(如ZooKeeper锁)。
唯一被KILL信号杀死的锁是操作系统级别的锁,因为所有的文件描述符都被杀死了,文件描述符锁也被杀死了。但是就ZooKeeper而言,这些锁不是操作系统级别的锁(仅仅是因为ZooKeeper进程,即使在同一台机器上,也不是你的python进程)。
因此,这不是ZooKeeper中的bug,而是kill -9的预期行为。