1

ワーカーの開始時に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 のみが開始され、ワー​​カー/タスクは開始されません。セロリにxmppを初期化してから、それを介してメッセージを送信するにはどうすればよいですか。いつも接続したり切断したりしたくありません。ワーカーが実行されている限り、xmpp クライアントはオンラインになっているはずです。

4

1 に答える 1

3

これを行うにはいくつかの方法があり、一般的な方法は次のとおりです。

_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)
于 2012-11-30T11:44:15.787 に答える