Python 动物园管理员的锁一直锁着

Python 动物园管理员的锁一直锁着,python,locking,celery,apache-zookeeper,kazoo,Python,Locking,Celery,Apache Zookeeper,Kazoo,我用芹菜和动物园管理员(kazoo锁)来锁我的工人。我有一个问题,当我在释放锁之前杀死(-9)个工人时,锁会永远锁着 所以我的问题是:杀死进程会释放该进程中的锁还是zookeeper中的某个bug?用杀死信号杀死进程不会清除“软件锁”,例如zookeeper锁 KILL信号杀死的唯一一种锁是操作系统级锁,因为所有文件描述符都会被杀死,因此文件描述符锁也会被杀死。但就ZooKeeper而言,这些不是操作系统级锁(这仅仅是因为ZooKeeper进程,即使在同一台机器上,也不是python进程的进程)

我用芹菜和动物园管理员(kazoo锁)来锁我的工人。我有一个问题,当我在释放锁之前杀死(-9)个工人时,锁会永远锁着


所以我的问题是:杀死进程会释放该进程中的锁还是zookeeper中的某个bug?

用杀死信号杀死进程不会清除“软件锁”,例如zookeeper锁

KILL信号杀死的唯一一种锁是操作系统级锁,因为所有文件描述符都会被杀死,因此文件描述符锁也会被杀死。但就ZooKeeper而言,这些不是操作系统级锁(这仅仅是因为ZooKeeper进程,即使在同一台机器上,也不是python进程的进程)

因此,它不是ZooKeeper中的一个bug,也是您的kill-9的预期行为。

ZooKeeper使用。临时节点是一个与创建它的会话的活动时间相同的节点。会话通过创建会话的进程定期向zookeeper发送心跳消息来保持活动状态

因此,如果您终止创建锁的进程,锁最终将被释放,因为zookeeper不再接收心跳,会话将终止

因此,在释放锁之前杀死一名工人最终应该会释放锁

如果锁一直没有释放,可能会发生一些事情

  • 其他人注意到锁被释放并获得了它。您可能是因为存在争用而锁定的,当释放锁时,其他进程将尝试获取锁
  • 你等的时间不够长。当您连接到zookeeper时,应该设置一个会话超时参数,即服务器在没有听到任何心跳的情况下保持会话活动的时间,您必须等待这么长时间才能看到锁被释放
  • 卡祖有一只虫子。这是可能的,但看起来kazoo使用的是临时节点,您描述的用例是一个非常基本的用例
  • 这不太可能是动物园管理员的错误


    你怎么知道锁没有被释放?

    吸引我注意的不是实际的问题,而是非常滑稽的问题title@inspectorG4dget:问题并不是没有解决,例如,“当我杀死一名工人时”@Milan Kocic我面临着同样的问题,如果拥有锁的线程被杀死,其他线程继续等待。在我的例子中,短暂的节点只有在我关闭ApacheTomcat时才会被删除。现在,我有一个变通方法,其中另一个线程检查父持久节点上的时间,如果在最近2*x时间内没有更新,则释放锁。但是,我认为这不是一种优雅的方式。你找到发生这种情况的原因了吗?你是如何解决问题的?谢谢,这证实了我的怀疑。你能告诉我,例如,我是否锁定了zookeeper锁很长时间,并且我在listener中的连接被挂起或丢失了。若我在一段时间后连接到连接,那个么该锁会发生什么情况?我应该保留该任务(当前锁是否正常)还是应该重复该任务(并在客户端和另一个锁上创建新锁)。所以,我应该等待已连接的信号,还是在锁定期间,如果我被挂起或丢失信号,就终止并重复当前任务。老实说,我不知道ZooKeeper文档可能会在这里告诉您更多。kill-9应该导致ZooKeeper会话终止,这应该会导致临时节点终止,这将导致zookeeper锁被锁定released@sbridges:否,kill-9不会终止TCP连接,ZooKeeper会话链接到连接。因此,如果您杀死-9,短暂节点仍然存在。我知道锁没有被释放,因为所有其他工作进程都在等待获取,而且我知道至少有一个工作进程在释放锁之前被杀死。为什么工人被杀你们可能会问:我这样做是因为我在锁被锁定期间丢失了连接信号,我不知道锁是如何工作的,它是否为其他工人在服务器上保持锁定(这就是我想要的)。获取和释放之间的操作需要很长时间,因此,如果在锁定期间我收到挂起或断开连接的信号,是否可以等待连接信号,或者我应该停止该任务并重复该任务。您能否仅使用一个工作人员进行复制?启动它,让它获取锁,杀死-9它,然后使用zookeeper命令行查看zookeeper中有哪些节点。在杀死worker之后,您不应该留下任何短暂的节点,会话超时已经过去。我将尝试,但我无法做到,因为我知道明天有演示:)对我来说,最好的情况是获取和释放等待连接连接信号,然后继续下一个操作。所以我可以知道临界区总是安全的。动物园管理员一切都很好。我曾经遇到过一些需要很长时间(大约10小时)才能释放锁的情况,但这是因为一些工作人员没有正确地释放锁,并且锁一直处于锁定状态,所以最大超时时间需要到期,以便可以释放锁。