【问题标题】:Flask + Celery: working outside of request contextFlask + Celery:在请求上下文之外工作
【发布时间】:2015-09-06 11:43:24
【问题描述】:

今天我开始使用 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 工人:

celery -A netdiff.celery worker

但是,当我调用任务时:

diff_ = {'control': {'maintenance': maintenance,},'netelement': {'host': net element, 'ip': ip, 'pyez': None,},}
implement_netdiff.apply_async(args=(diff_,))

Celery 抱怨:

[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() 做什么?

【问题讨论】:

  • 编辑:我将函数的声明更改为“def implement_netdiff(self, diff_):”并且它不再抱怨了。
  • 如果问题已经得到解答,我建议您接受答案。如果您还有更多疑问,建议您提出不同的问题。

标签: python flask celery


【解决方案1】:

这是documented

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

【讨论】:

  • 感谢@dhke,我在写完这篇文章后才注意到。您对如何解决来自 Flask 的外部上下文抱怨有任何想法吗?
  • @NikosSkalis 不是真的没有。你确定是芹菜在抱怨吗?据我所知,这是一条 Flask 错误消息。
  • 是的,是的。 Flask 在抱怨。我尝试了编辑中描述的内容。但仍然没有。
【解决方案2】:

即使按照记录完成了所有操作,我仍然收到“外部上下文”错误,因为我没有使用“sudo”启动 celery。因此,如果有人处于像我这样的情况,这可能是另一种尝试的解决方案。

【讨论】:

    【解决方案3】:

    bind = True 导致问题。你可以删除它。

    请参阅documentation

    【讨论】:

    • 另一个答案的重复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2023-02-03
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多