如何按名称调用芹菜任务



我们有一个使用芹菜的Python应用程序,RabbitMQ作为代理。把这个应用程序看作是一个管理应用程序,它只把消息/任务放到Broker中,不会对它们进行操作。

将有另一个应用程序(可能是基于Python的,也可能不是基于Python的)将对消息进行操作。

管理应用程序是否有可能将消息/任务放在队列上,当该任务不存在于其代码库中?如果是这样,我该怎么做呢?

有一种更"Celery-esque"的方式叫做Signatures。设置一个指向同一个代理的芹菜应用,并为你的任务创建一个签名:

from celery import Celery
celeryapp = Celery(...)
my_task = celeryapp.signature('task.add')
result = my_task.delay(2, 2)
print result.get()
  1. 创建Celery的新实例或从模块导入。
  2. 调用send_task()方法

    from twittershell.core import app # Celery Instance from a module
    async_result = app.send_task(name='tasks.followers', args=(529675892, ))
    

send_task方法的签名为:

    def send_task(self, name, args=None, kwargs=None, countdown=None,
              eta=None, task_id=None, producer=None, connection=None,
              router=None, result_cls=None, expires=None,
              publisher=None, link=None, link_error=None,
              add_to_parent=True, reply_to=None, **options):

您可以使用AMQP客户端向队列发送新消息,现有消息的列表可以在rabbitMQ文档中找到。

如何做到这一点实际上取决于您将使用的客户端和语言,但原则上所有内容都是发送符合芹菜使用的协议的消息:

# sample message shown in the celery docs
{"id": "4cc7438e-afd4-4f8f-a2f3-f46567e7ca77",
 "task": "celery.task.PingTask",
 "args": [],
 "kwargs": {},
 "retries": 0,
 "eta": "2009-11-17T12:30:56.527191"}

您可以在这里的芹菜文档中找到更详细的消息描述。

例如,如果使用kombu客户端(这是python的一个也被芹菜使用),你将做这样的事情:

with Connection("my_broker_url") as connection:
    queue = connection.SimpleQueue(queue_name)
    message = {"id": "4cc7438e-afd4-4f8f-a2f3-f46567e7ca77",
               "task": "celery.task.PingTask",
               "args": [],
               "kwargs": {},
               "retries": 0,
               "eta": "2009-11-17T12:30:56.527191"}
    queue.put(message,
              serializer="json")

这是一个来自kombu文档的高度精简的例子

周围进行更多搜索后继续执行

所以我完全忘了提到花,这是一个很棒的芹菜监控和管理工具。它作为一个守护进程运行,并公开了一个web界面和一个很好的Rest API!

我发现你可以从花API发送任务,就像这样简单:

POST /api/task/send-task/tasks.add HTTP/1.1
Accept: application/json
Accept-Encoding: gzip, deflate, compress
Content-Length: 16
Content-Type: application/json; charset=utf-8
Host: localhost:5555
{
    "args": [1, 2]
}

有几个API端点允许您这样做,但有一些不同:

  • 派遣
  • async-apply

但是在这种情况下,您可能想要使用send-task,因为它明确地声明您不需要任务源。

希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新