今天我开始使用Celery,但我遇到了一个无法解决的问题。 更具体地说,
我的Flask配置是:
from celery import Celery
def make_celery(app):
celery = Celery(__name__, broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)
TaskBase = celery.Task
class ContextTask(TaskBase):
abstract = True
def __call__(self, *args, **kwargs):
with app.app_context():
return TaskBase.__call__(self, *args, **kwargs)
celery.Task = ContextTask
return celery
app.config.update(CELERY_BROKER_URL="redis://127.0.0.1:6379", CELERY_RESULT_BACKEND="redis://127.0.0.1:6379", CELERY_IMPORTS=("netdiff"), CELERY_TASK_RESULT_EXPIRES = 300, CELERY_REDIRECT_STDOUTS_LEVEL="DEBUG")
celery = make_celery(app)
我有1个Celery任务声明为:
@celery.task(name="implement_netdiff", bind=True)
def implement_netdiff(diff_):
我经营一名芹菜工人:
celery -A netdiff.celery worker
但是,当我打电话给任务时:
diff_ = {'control': {'maintenance': maintenance,},'netelement': {'host': net element, 'ip': ip, 'pyez': None,},}
implement_netdiff.apply_async(args=(diff_,))
芹菜抱怨:
[2015-06-20 17:23:45,307: ERROR/MainProcess] Task implement_netdiff[714d5cee-b466-4075-9f8c-1b59b745e706] raised unexpected: TypeError('implement_netdiff() takes exactly 1 argument (2 given)',)
Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/celery/app/trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/app/netdiff/netdiff.py", line 19, in __call__
return TaskBase.__call__(self, *args, **kwargs)
File "/usr/lib/python2.7/site-packages/celery/app/trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
TypeError: implement_netdiff() takes exactly 1 argument (2 given)
你能告诉你如何解决这个问题吗?
编辑:我将函数的声明更改为“def implement_netdiff(self,diff_):”并且它不再抱怨了。
编辑:“在请求上下文之外工作”已解决如下:
def implement_netdiff(self, diff_):
with celery.app.app_context():
问题:celery.start()
的作用是什么?
答案 0 :(得分:0)
这是documented。
通过指定bind=True
,您要求celery绑定您的方法并获取任务类型实例作为第一个“self
”参数。
答案 1 :(得分:0)
即使按照文档所述进行了所有操作,我仍然收到“外部上下文”错误,因为我没有以“ sudo”开始芹菜。因此,如果有人遇到像我这样的情况,那可能是另一种尝试的解决方案。