如何设置Celery以调用自定义工作程序初始化?

时间:2014-11-02 20:36:15

标签: python celery

我对Celery很新,我一直在尝试设置一个带有2个独立队列的项目(一个用于计算,另一个用于执行)。到现在为止还挺好。

我的问题是执行队列中的worker需要使用唯一的object_id(每个worker一个id)实例化一个类。我想知道我是否可以编写自定义工作线程初始化以在启动时初始化对象并将其保留在内存中直到工作程序被杀死。

我在custom_task上发现了类似的问题,但建议的解决方案在我的情况下不起作用。

考虑以下玩具示例:

celery.py

from celery import Celery

app = Celery('proj',
             broker='amqp://guest@localhost//',
             backend='amqp://',
             include=['proj.tasks'])

app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=60,
    CELERY_ROUTES = {"proj.tasks.add1": {"queue": "q1"}},
)

if __name__ == '__main__':
    app.start()

tasks.py

from proj.celery import app
from celery.signals import worker_init

@worker_init.connect(sender='worker1@hostname')
def configure_worker1(*args, **kwargs):
    #SETUP id=1 for add1 here???

@worker_init.connect(sender='worker2@hostname')
def configure_worker2(*args, **kwargs):
    #SETUP id=2 for add1 here???

@app.task
def add1(y):
    return id + y

@app.task
def add(x, y):
    return x + y

初​​始化:

celery multi start worker1 -A proj -l info -Q q1
celery multi start worker2 -A proj -l info -Q q1
celery multi start worker3 -A proj -l info

这是正确的做法吗?如果是这样,我应该在configure_worker1中的tasks.py函数中编写什么来在工人初始化时设置id

谢谢

1 个答案:

答案 0 :(得分:4)

我按照http://docs.celeryproject.org/en/latest/userguide/tasks.html#instantiation

找到了答案

tasks.py看起来像这样:

from proj.celery import app
from celery import Task

class Task1(Task):
    def __init__(self):
        self._x = 1.0

class Task2(Task):
    def __init__(self):
        self._x = 2.0

@app.task(base=Task1)
def add1(y):
    return add1._x + y

@app.task(base=Task2)
def add2(y):
    return add2._x + y

像以前一样初始化:

celery multi start worker1 -A proj -l info -Q q1
celery multi start worker2 -A proj -l info -Q q1
celery multi start worker3 -A proj -l info