试图把头缠在芹菜上。到目前为止,我了解到有客户,经纪人和工作人员。为简单起见,我看的是Dockerized version of this setup。
如果我理解正确,则客户端将任务排队到代理上,然后工作人员不断尝试从代理弹出并处理任务。
在示例中,似乎Client (in this case a Flask app)和Worker都引用了exact same code。正确吗?
这是否意味着如果每个组件都分解成自己的计算机,那么代码将需要同时部署到Client和Worker计算机上吗?这些片段需要访问相同的任务/功能来完成各自的工作,这似乎很奇怪。
答案 0 :(得分:1)
这也是我最初感到困惑的一件事。任务的代码不必同时出现在两者上,只有工作人员需要代码才能进行实际工作。当您说客户将任务交由随后由工人执行的经纪人排队时,了解其工作原理至关重要。客户端仅向代理发送消息,而不向实际任务发送消息。该消息包含任务名称,参数和其他内容。因此,客户端只需知道有关任务入队的这些参数即可。然后,它可以使用send_task
在不知情的情况下将任务排队。
这就是我在一个简单的Jobber应用程序中使用Celery的方式,在该应用程序中我想尽可能地使各个部分分离。我有一个Flask应用程序,用作用户可以管理的作业的UI(创建,查看状态/进度等)。Flask应用程序使用APScheduler实际运行作业(其中,除Celery任务外,别无其他) 。现在,我希望客户端部分(Flask应用程序+计划程序)尽可能少地了解将其作为作业运行的任务。这意味着他们可以接受他们的名字和论点。为了使其真正独立于任务代码,我通过代理从工作人员那里获得了此信息。您可以看到我最初创建的this issue的更多背景。