我们有一个运行 celery 工作线程的服务器和一个 Redis 队列。任务是在该服务器上定义的。
我需要能够从远程计算机调用这些任务。
我知道这是使用
send_task
完成的,但我仍然不知道如何实现?我如何告诉 send_task
队列在哪里?我在哪里传递连接参数(或任何需要的参数)?我已经找了好几个小时了,我能找到的就是这个:
from celery.execute import send_task
send_task('tasks.add')
嗯,这意味着我的呼叫机器上也需要
celery
。但我还需要设置什么吗?
这可能是一个办法: 创建一个 Celery 对象并使用该对象中的 send_task,该对象可以具有查找代理的配置。
from celery import Celery
celery = Celery()
celery.config_from_object('celeryconfig')
celery.send_task('tasks.add', (2,2))
celeryconfig 是一个包含 celery 配置的文件,还有其他方法在 celery 对象上设置配置。
定义路由规则的方法有多种,其中最通用的是自定义路由器对象。在所有情况下,调用者只需在
routing_key
、send_task
或 delay
中提供 apply_async
参数,然后路由器确定将任务发送到哪个队列。
在远程计算机上,启动 celery,并使用指向要运行任务的计算机的broker_url。然后只需提交任务(如果您有特定的队列要提交,则添加适当的路由键)。
根据最新更新,该方法是app方法之一。 例如:
from project.celery_general import general_app
# general app is celery app you defined
general_app.send_task(name='your_task_name', *args, **kwargs)
莱昂纳多·鲁伊斯的接受的答案对我有用。 但是他的代码没有提供所提供的 celery 配置示例。另外,如果您的任务名称有前缀,那么您必须提供完整的路径。
将以下代码分享给其他人。
'tasks.add' 作为输入传递给 send_task
从芹菜进口芹菜应用程序 = 芹菜('celery_app', 代理='redis://localhost:6379/0', ) data = (2,2) # 样本数据 app.send_task('myapp.subfolder.celery_app.tasks.add', data)
from celery.execute import send_task
send_task('tasks.add')
如果需要任何参数
send_task('tasks.add', kwargs={'a': 1, 'b': 2})