2015-06-20 63 views
1

今天我开始使用芹菜,但遇到了无法解决的问题。 更具体地说,烧瓶+芹菜:在请求范围外工作

我的瓶的配置是:

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.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 implement _diff(self,diff_):”并且它不再抱怨。

编辑: “工作请求上下文之外” 得到解决,如:

def implement_netdiff(self, diff_): 
    with celery.app.app_context(): 

问:celery.start()呢?

+0

编辑:我改变了函数的声明为“def implement implement _diff(self,diff_):”,它不再抱怨了。 – iamsterdam

+0

如果问题得到解答,我建议您接受答案。如果您仍然有更多疑问,建议您提出不同的问题。 –

回答

0

这是documented

通过指定bind=True,您可以让芹菜绑定您的方法并获取任务类型实例作为第一个“self”参数。

+0

谢谢@dhke,在写帖子后我注意到了一点。你有没有想法如何解决Flask的上下文抱怨? – iamsterdam

+0

@NikosSkalis不是真的没有。你确定它是抱怨的芹菜吗?从我收集的这是一个Flask错误消息。 – dhke

+0

是的,是真的。 Flask正在抱怨。我尝试了在编辑中描述的内容。但仍然没有。 – iamsterdam