假设我有一个依赖于大型模块的芹菜工人,X。
由于任务定义需要引用工作者应用程序def(例如,@ app.task),这意味着我的"客户端" (安排任务的代码)也需要依赖于这个模块。
这对我没有意义 - 我错了吗?
A)。我不希望我的任务调用者拥有这些依赖项(例如,它们可能位于不同的docker容器中)。
B)。出于安全原因,我不希望我的任务调用者能够访问此代码。
有办法吗?
谢谢,
RB
答案 0 :(得分:2)
您的客户端代码可以远程启动任务,而无需导入任务的实现。显然,您必须将客户端配置为与工作程序连接到同一代理,但一旦完成,您就可以使用signatures来调用任务:
import celery
result = celery.signature("app.tasks.foo", args=(1, )).delay().get()
celery.signature
的第一个参数是任务的名称。它通常是包含任务的模块的绝对名称(例如,上面代码中的app.tasks
)加上任务名称(foo
)。
答案 1 :(得分:0)
实现此目标的一种方法是使用celery的app.send_task方法。 您可以使用以下代码行将客户端配置为连接到与工作人员相同的代理。
from celery import Celery
#app = Celery()
#app.config_from_object('celeryconfig') #OR below line
app = Celery('tasks',broker='redis://localhost', backend='redis://localhost')
然后,您可以使用以下代码行将任务发送到代理(队列),而无需导入任何工作程序代码模块:
celery.send_task('tasks.add', (2,2))
任何与代理连接的工作人员都将接管任务并执行。 您可能需要在worker代码模块的装饰器@ app.task(name ='add')中添加name参数。 查看this celerey thread了解更多信息。