芹菜任务和xmpp

Posted

技术标签:

【中文标题】芹菜任务和xmpp【英文标题】:celery task and xmpp 【发布时间】:2012-11-29 14:39:58 【问题描述】:

我有一个 celery 任务,需要在 worker 启动时启动一个 xmpp,但它并没有真正起作用

from celery import Celery
from MyXmpp import MyXmpp

celery = Celery('myxmpp')
celery.config_from_object('celeryconfig')

myjabber = MyXmpp()

@celery.task 
def worker_send_jabber(message):
   myjabber.send_admin_xmpp(message)

如果我这样做,它只会启动 xmpp,但不会启动工作程序/任务。我怎样才能让 celery 初始化我的 xmpp,然后通过它发送消息。我不希望它一直连接和断开连接。只要 worker 正在运行,xmpp 客户端就应该在线。

【问题讨论】:

类似的问题,但它不起作用...***.com/questions/8750043/… 这实际上是我在上面尝试做的,但它只启动 xmpp 但不运行任务本身。 【参考方案1】:

有几种方法可以做到这一点,一种常见的方法是:

_client = None

def get_client():
    global _client
    if _client is None:
        _client = MyXmpp()
    return _client

@celery.task
def send_jabber(message):
    get_client().send_admin_xmpp(message)

但有些人可能更喜欢这个版本:

from celery import Celery, Task
from celery.utils import cached_property

class XmppTask(Task):
    Client = MyXmpp
    abstract = True

    def __call__(self, *args, **kwargs):
        # passes self argument to the task body
        return super(XmppTask, self).__call__(self, *args, **kwargs)

    @cached_property
    def client(self):
        return self.Client()


celery = Celery()
@celery.task(base=XmppTask):
def send_jabber(self, message):
    return self.client.send_admin_xmpp(message)

【讨论】:

btw,第二个版本不会缓存继承自 XmppTask 的任务之间的连接,所以这是第一个示例的缺点。更好的方法是使用连接池。 我会试试这个,但最后我今天把芹菜放在了这个上面,并写了我的库来处理来自 rabbitmq 的消息。我用 django 和 celery.send_task 将它们交付到队列中,并在我的 jabber 客户端中使用我自己的处理程序来接收它们。这对我来说很好,连接不需要共享 btw 任务总是只有一个 jabber 连接在运行,并且交付它们将需要尽可能长的时间。但是...无论如何我都会尝试您的解决方案,并会告诉您它是否有效。无论如何,我会接受您的解决方案作为答案!谢谢戴夫

以上是关于芹菜任务和xmpp的主要内容,如果未能解决你的问题,请参考以下文章

用芹菜对特定任务设置时间限制

芹菜任务和自定义装饰器

芹菜 - 无法获取任务结果

从芹菜任务中获取芹菜工人的名字?

Flower UI 不显示芹菜工人和任务

芹菜:列出所有任务,计划的,活动的*和*完成