Python 以某种方式确定正在优雅地关闭的芹菜工人

Python 以某种方式确定正在优雅地关闭的芹菜工人,python,celery,Python,Celery,我有三个芹菜工人,如下所示,每个工人在不同的ECS节点上运行: 生产者:不断生成任务并将其发送给消费者工作者。每个任务预计需要几分钟的计算时间,并且有一个数据库记录 使用者:接收计算任务并立即开始执行 Watchdog:定期检查数据库记录,找出正在执行的计算任务,然后执行celery inspect active,以验证是否确实有工作人员执行计算 我们确保当使用者节点被终止时,其上的芹菜工作者将开始正常关机,以便正在进行的计算可以正常完成。因为芹菜会注销一个优雅地停止工作的工人,看门狗会看不

我有三个芹菜工人,如下所示,每个工人在不同的ECS节点上运行:

  • 生产者:不断生成任务并将其发送给消费者工作者。每个任务预计需要几分钟的计算时间,并且有一个数据库记录
  • 使用者:接收计算任务并立即开始执行
  • Watchdog:定期检查数据库记录,找出正在执行的计算任务,然后执行
    celery inspect active
    ,以验证是否确实有工作人员执行计算
我们确保当使用者节点被终止时,其上的芹菜工作者将开始正常关机,以便正在进行的计算可以正常完成。因为芹菜会注销一个优雅地停止工作的工人,看门狗会看不见消费者,看门狗会错误地认为一个计算任务神秘地丢失了。。。即使消费者仍在执行任务


有没有可能让芹菜工人在收到热关机信号后广播“我要死了”的信息?或者更好的是,我们是否可以让看门狗员工看到关闭的员工?

是的,这是可能的。我负责的芹菜集群中的节点也在做类似的事情。以下是一个片段:

@worker_shutdown.connect
def handle_worker_shutdown(**kwargs):
    _handle_worker_shutdown(app, _LOGGER, **kwargs)


@worker_ready.connect
def handle_worker_ready(**kwargs):
    _handle_worker_ready(app, _LOGGER, **kwargs)

还有一些其他的,非常有用的,你应该看看,但这两个是必不可少的。可能更适合您的用例…

hmmm但是
worker\u shutdown
信号在worker即将关机之前发出,这是在当前任务完成之后发出的。但是,当它仍在处理当前任务时(由于正常关机),其他人已经看不到该工作进程,因此问题在于看门狗错误地认为该工作进程丢失了……正如我所提到的,您还需要检查其他信号。。。我用更适合您的用例的内容更新了答案。Thx~但恐怕这也不适合您的目的。。我已经尝试了
worker\u shutdown\u
worker\u shutdown
,但在正常关机时,即芹菜
MainProcess
警告
从远程关机时,不会发出任何信号。仍然找不到足够好的信号:(.Idk,我不断地向工人发送关机信号,信号处理程序也在工作……当信号被捕获时,你的芹菜工人是否仍在执行一项正在进行的任务?如果没有任何正在进行的任务,并且芹菜没有正常关机,关机信号几乎会立即发送。但是在正常关机期间,如果说currentl如果运行任务需要10分钟,那么在该任务完成之前,工人不会关机。在这种情况下,信号不会在接下来的10分钟内发送(据我观察)~~