用户定义的芹菜任务类:在导入期间调用init

时间:2015-02-08 06:26:51

标签: python multithreading celery distributed-computing

我正在尝试将芹菜任务用作课程并查看以下行为。我猜我错过了什么。让我先告诉你我想要实现的目标:
1.使用init函数创建一个类,芹菜只调用一次。这将为我的课程设置所需的参数。我将在这里创建一个线程池。
2.在生产者中创建此芹菜任务对象的实例并将作业放入其中。

为了实现同样的目的,我尝试了在celery网站上提到的天真的例子,并创建了一个示例类。我正在使用:

创建任务

celery -c 1 -A proj worker --loglevel = debug

它似乎首先工作,但后来我发现任务的init在test.py中被导入调用,我可以通过传递标志来停止对象使用中的init,但导入期间的init是一个真正的问题。

请指点我正确使用这个例子。我不希望调用任务类的init比使用celery命令调用的更多。在现实生活中,它会产生不必要的线程。

如果可能的话,请指出一个最接近我上述要求的例子。

celery.py

from __future__ import absolute_import
from celery import Celery
app = Celery('proj',
         broker='amqp://',
         backend='amqp://',
         include=['proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    CELERY_TASK_RESULT_EXPIRES=3600,
)

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

tasks.py

from __future__ import absolute_import
from proj.celery import app

class NaiveAuthenticateServer(app.Task):

def __init__(self, celeryInst = 1):
    if celeryInst == 1:
        print "Hi, I am celery instant"
    else :
        print "Did you invoke me from command"
    self.users = {'george': 'password'}

def run(self, username, password):
    try:
        return self.users[username] == password
    except KeyError:
        return False

tester.py

from proj import tasks
obj = tasks.NaiveAuthenticateServer(0)
res = obj.delay('hi', 'hello')
print res.get()

test.py

的o / p

嗨,我是芹菜   你是从命令中调用我的吗?   错误

1 个答案:

答案 0 :(得分:0)

您不应该自己创建任务类的实例,而是让芹菜在流程启动时自动为您执行此操作。

因此,您需要定义一个使用基类的任务函数:

@app.task(base=NaiveAuthenticateServer)
def my_task(arg1, arg2):
    print arg1, arg2

然后像这样提交任务:

from proj import tasks
tasks.my_task.delay('hi', 'hello')