Celery中持久的长期运行任务

时间:2015-08-23 09:35:08

标签: python rabbitmq task celery long-running-processes

我正在研究一个基于Python的系统,将长时间运行的任务排入工作人员。

任务来自生成“令牌”的外部服务,但是一旦它们基于该令牌创建,它们应该连续运行,并且仅在通过代码明确删除时停止。 该任务启动一个WebSocket并在其上循环。如果套接字已关闭,则会重新打开它。基本上,任务不应该得出结论。

我在构建此解决方案时的目标是:

  1. 当正常重新启动工作人员(例如加载新代码)时,应该将任务重新添加到队列中,并由某个工作人员接收。
  2. 当发生非正常关机时,应该发生同样的事情。
  3. 2名工人不应该以相同的方式工作。
  4. 其他进程可能会创建更多任务,这些任务应该定向到处理特定令牌的同一个工作人员。这将通过将这些任务发送到以令牌命名的队列来解决,该队列在启动令牌任务后应该开始监听。我列出了这个要求,作为解释为什么在这里甚至需要任务引擎的原因。
  5. 独立服务器,快速重新加载代码等 - 每项任务的停机时间最短。
  6. 我们所有的服务器端都是Python,看起来Celery是最好的平台。 我们在这里使用合适的技术吗?我们应该考虑的任何其他架构选择?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

根据docs

  

当启动关闭时,工作人员将在实际终止之前完成所有当前正在执行的任务,因此如果这些任务很重要,您应该等待它完成任何激烈的操作(如发送KILL信号)。

     

如果工作人员在考虑周期之后不会关闭,例如由于任务陷入无限循环,您可以使用KILL信号强制终止工作人员,但要注意当前正在执行的任务将丢失(除非任务设置了acks_late选项。

使用retry or acks_late

可能会得到您想要的内容

总的来说,我认为你需要实现一些额外的应用程序端作业控制,以及锁定服务。

但是,是的,总的来说你可以用芹菜做到这一点。是否有更好的技术......这超出了本网站的范围。