Celery - 如何从远程机器发送任务?

问题描述 投票:0回答:6

我们有一个运行 celery 工作线程的服务器和一个 Redis 队列。任务是在该服务器上定义的。
我需要能够从远程计算机调用这些任务。
我知道这是使用

send_task
完成的,但我仍然不知道如何实现?我如何告诉
send_task
队列在哪里?我在哪里传递连接参数(或任何需要的参数)?我已经找了好几个小时了,我能找到的就是这个:

from celery.execute import send_task
send_task('tasks.add')

嗯,这意味着我的呼叫机器上也需要

celery
。但我还需要设置什么吗?

python celery
6个回答
64
投票

这可能是一个办法: 创建一个 Celery 对象并使用该对象中的 send_task,该对象可以具有查找代理的配置。

from celery import Celery
celery = Celery()
celery.config_from_object('celeryconfig')
celery.send_task('tasks.add', (2,2))

celeryconfig 是一个包含 celery 配置的文件,还有其他方法在 celery 对象上设置配置。


0
投票

定义路由规则的方法有多种,其中最通用的是自定义路由器对象。在所有情况下,调用者只需在

routing_key
send_task
delay
中提供
apply_async
参数,然后路由器确定将任务发送到哪个队列。


0
投票

在远程计算机上,启动 celery,并使用指向要运行任务的计算机的broker_url。然后只需提交任务(如果您有特定的队列要提交,则添加适当的路由键)。


0
投票

根据最新更新,该方法是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)

参考


0
投票

莱昂纳多·鲁伊斯接受的答案对我有用。 但是他的代码没有提供所提供的 celery 配置示例。另外,如果您的任务名称有前缀,那么您必须提供完整的路径。

将以下代码分享给其他人。

  1. 我使用Redis作为代理,您可以替换为您选择的代理。

  2. 如果您的任务没有任何前缀,那么您只需将

    'tasks.add' 作为输入传递给 send_task

    从芹菜进口芹菜

    应用程序 = 芹菜('celery_app', 代理='redis://localhost:6379/0', ) data = (2,2) # 样本数据 app.send_task('myapp.subfolder.celery_app.tasks.add', data)


-7
投票
您的发现是正确的。

from celery.execute import send_task send_task('tasks.add')

如果需要任何参数

send_task('tasks.add', kwargs={'a': 1, 'b': 2})
    
© www.soinside.com 2019 - 2024. All rights reserved.