Celery 任务代码是否需要存在于多台机器上?

Does Celery task code need to exist on multiple machines?

试图把我的头缠在芹菜上。到目前为止,我了解到有客户、经纪人和工人。为简单起见,我正在查看 Dockerized version of this setup.

如果我理解正确的话,客户端在代理上排队任务,然后工作人员不断尝试从代理中弹出并处理任务。

在例子中,好像都是Client (in this case a Flask app) and the Worker, reference the exact same code。对吗?

这是否意味着如果每个组件都分解到它们自己的机器上,代码将需要同时部署到客户端和工作机器上?这些部分需要访问相同的 task/function 来完成各自的工作,这似乎很奇怪。

这也是我最初感到困惑的一件事。任务的代码不必同时出现在两者上,只有工作人员需要代码来完成实际工作。当您说客户端将任务排入 broker 中然后由 worker 执行时,了解其工作原理至关重要。客户端只向代理发送消息,而不是实际任务。该消息包含任务名称、参数和其他内容。所以客户端只需要知道这些关于任务的参数就可以将它排入队列。然后,它可以使用send_task在不知道的情况下将任务入队。

这就是我在一个简单的 jobber 应用程序中使用 Celery 的方式,我想在其中尽可能地分离各个部分。我有一个 Flask 应用程序作为 UI 用于用户可以管理的作业(创建,参见 state/progress 等)Flask 应用程序使用 APScheduler 实际上 运行 作业(其中一份工作就是一个 Celery 任务)。现在,我希望客户端部分(Flask 应用程序 + 调度程序)尽可能少地了解 运行 将它们作为作业的任务。这意味着他们可以接受他们的名字和论据。为了使其真正独立于任务代码,我通过代理从工作人员那里获取了这些信息。您可以从我最初创建的 this issue 中看到更多背景信息。