【问题标题】:Cannot get working Django Celery Kombu using tutorial使用教程无法使用 Django Celery Kombu
【发布时间】:2016-01-17 16:09:36
【问题描述】:

尝试让它工作:Django 1.6.11 + Celery 3.1.19 + Kombu 3.0.33 on Ubuntu 14.04 using tutorial http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html 所以我从这里完全重复了项目结构: https://github.com/celery/celery/tree/3.1/examples/django/

当我从 django 项目根目录运行命令时: /var/www/engine$ celery worker -l INFO -B

在我的应用 vk_wall 中,我有 tasks.py 文件,其中包含 add 任务。

我得到一个错误:

    graph@engine:/var/www/engine$ celery worker -l INFO -B
[2016-01-17 18:41:41,159: WARNING/MainProcess] /usr/local/lib/python3.4/dist-packages/celery/apps/worker.py:161: CDeprecationWarning:
Starting from version 3.2 Celery will refuse to accept pickle by default.

The pickle serializer is a security concern as it may give attackers
the ability to execute any command.  It's important to secure
your broker from unauthorized access when using pickle, so we think
that enabling pickle should require a deliberate action and not be
the default choice.

If you depend on pickle then you should set a setting to disable this
warning and to be sure that everything will continue working
when you upgrade to Celery 3.2::

    CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']

You must only enable the serializers that you will actually use.


  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))

 -------------- celery@engine v3.1.19 (Cipater)
---- **** -----
--- * ***  * -- Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         default:0x7f9c6495cc18 (.default.Loader)
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     disabled
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery


[tasks]


[2016-01-17 18:41:41,187: INFO/Beat] beat: Starting...
[2016-01-17 18:41:41,212: ERROR/Beat] Removing corrupted schedule file 'celerybeat-schedule': error(13, 'Permission denied')
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/kombu/utils/__init__.py", line 323, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'scheduler'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 376, in setup_schedule
    self._store = self._open_schedule()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 366, in _open_schedule
    return self.persistence.open(self.schedule_filename, writeback=True)
  File "/usr/lib/python3.4/shelve.py", line 239, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/lib/python3.4/shelve.py", line 223, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/lib/python3.4/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: [Errno 13] Permission denied
[2016-01-17 18:41:41,219: ERROR/Beat] Process Beat
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/kombu/utils/__init__.py", line 323, in __get__
    return obj.__dict__[self.__name__]
KeyError: 'scheduler'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 376, in setup_schedule
    self._store = self._open_schedule()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 366, in _open_schedule
    return self.persistence.open(self.schedule_filename, writeback=True)
  File "/usr/lib/python3.4/shelve.py", line 239, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/lib/python3.4/shelve.py", line 223, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/lib/python3.4/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/billiard/process.py", line 292, in _bootstrap
    self.run()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 545, in run
    self.service.start(embedded_process=True)
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 464, in start
    humanize_seconds(self.scheduler.max_interval))
  File "/usr/local/lib/python3.4/dist-packages/kombu/utils/__init__.py", line 325, in __get__
    value = obj.__dict__[self.__name__] = self.__get(obj)
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 504, in scheduler
    return self.get_scheduler()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 499, in get_scheduler
    lazy=lazy)
  File "/usr/local/lib/python3.4/dist-packages/celery/utils/imports.py", line 53, in instantiate
    return symbol_by_name(name)(*args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 358, in __init__
    Scheduler.__init__(self, *args, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 185, in __init__
    self.setup_schedule()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 378, in setup_schedule
    self._store = self._destroy_open_corrupted_schedule(exc)
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 372, in _destroy_open_corrupted_schedule
    return self._open_schedule()
  File "/usr/local/lib/python3.4/dist-packages/celery/beat.py", line 366, in _open_schedule
    return self.persistence.open(self.schedule_filename, writeback=True)
  File "/usr/lib/python3.4/shelve.py", line 239, in open
    return DbfilenameShelf(filename, flag, protocol, writeback)
  File "/usr/lib/python3.4/shelve.py", line 223, in __init__
    Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
  File "/usr/lib/python3.4/dbm/__init__.py", line 94, in open
    return mod.open(file, flag, mode)
_gdbm.error: [Errno 13] Permission denied[2016-01-17 18:41:41,227: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//

[2016-01-17 18:41:41,252: INFO/MainProcess] mingle: searching for neighbors
[2016-01-17 18:41:42,272: INFO/MainProcess] mingle: all alone
[2016-01-17 18:41:42,302: WARNING/MainProcess] celery@engine ready.
[2016-01-17 18:42:45,778: ERROR/MainProcess] Received unregistered task of type 'vk_wall.tasks.mul'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'expires': None, 'errbacks': None, 'callbacks': None, 'args': (2, 5), 'kwargs': {}, 'utc': True, 'retries': 0, 'eta': '2016-01-17T15:42:55.746877+00:00', 'task': 'vk_wall.tasks.mul', 'id': '38c3c3d3-3b53-4c58-a308-d41ed24ea613', 'timelimit': (None, None), 'chord': None, 'taskset': None} (302b)
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/celery/worker/consumer.py", line 455, in on_task_received
    strategies[name](message, body,
KeyError: 'vk_wall.tasks.mul'
[2016-01-17 18:42:45,786: ERROR/MainProcess] Received unregistered task of type 'vk_wall.tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'expires': None, 'errbacks': None, 'callbacks': None, 'args': (2, 2), 'kwargs': {}, 'utc': True, 'retries': 0, 'eta': None, 'task': 'vk_wall.tasks.add', 'id': 'cc04ddae-024e-4884-9a10-7a7066206fa9', 'timelimit': (None, None), 'chord': None, 'taskset': None} (264b)
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/celery/worker/consumer.py", line 455, in on_task_received
    strategies[name](message, body,
KeyError: 'vk_wall.tasks.add'

我看到 celery beat 问题,在回溯中我看到 celery 可以找到 add、mul、get_wallposts_by_owner_id 任务,但无法执行它们(在我的views.py中我调用它们:from vk_wall.tasks import add, mul res_mul = mul.apply_async((2, 5), queue='celery', 倒计时=10) res_add = add.delay(2, 2))

我还安装了 django-celery 以在管理面板中查看任务。

顺便说一句:在初学者教程http://docs.celeryproject.org/en/latest/getting-started/next-steps.html 中,我能够让 celery 工作和执行任务,但现在需要 django 来访问任务中的模型。

UPD:我的 settings.py django 文件

    BROKER_URL = 'django://'

#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html)
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_RESULT_EXPIRES=3600,
#CELERY_RESULT_BACKEND='amqp',
CELERY_RESULT_BACKEND='djcelery.backends.database:DatabaseBackend',
#CELERY_RESULT_BACKEND='djcelery.backends.cache:CacheBackend',
CELERY_RESULT_SERIALIZER = 'pickle', #json
CELERY_TASK_SERIALIZER = 'pickle',
CELERY_IMPORTS=["vk_wall.tasks"]

UPD2:我的celery.py文件(位于firstapp/firstapp,与django的settings.py同级)

from __future__ import absolute_import

import os

from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'firstapp.settings')

from django.conf import settings  # noqa

app = Celery('firstapp')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

UPD3:完整回溯

    graph@engine:/var/www/engine$ celery worker -A firstapp.settings -l debug
    Traceback (most recent call last):
      File "/usr/local/bin/celery", line 11, in <module>
        sys.exit(main())
      File "/usr

/local/lib/python3.4/dist-packages/celery/__main__.py", line 30, in main
    main()
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 81, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/celery.py", line 770, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 309, in execute_from_commandline
    argv = self.setup_app_from_commandline(argv)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 469, in setup_app_from_commandline
    self.app = self.find_app(app)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 489, in find_app
    return find_app(app, symbol_by_name=self.symbol_by_name)
  File "/usr/local/lib/python3.4/dist-packages/celery/app/utils.py", line 229, in find_app
    sym = symbol_by_name(app, imp=imp)
  File "/usr/local/lib/python3.4/dist-packages/celery/bin/base.py", line 492, in symbol_by_name
    return symbol_by_name(name, imp=imp)
  File "/usr/local/lib/python3.4/dist-packages/kombu/utils/__init__.py", line 96, in symbol_by_name
    module = imp(module_name, package=package, **kwargs)
  File "/usr/local/lib/python3.4/dist-packages/celery/utils/imports.py", line 101, in import_from_cwd
    return imp(module, package=package)
  File "/usr/lib/python3.4/importlib/__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2224, in _find_and_load_unlocked
ImportError: No module named 'firstapp'

【问题讨论】:

  • 你的函数addmul等是否有@task@shared_task装饰器?
  • 还要检查文件celerybeat-schedule 的权限,无论它在哪里 - 您的当前用户无权删除此文件。它似乎已损坏。
  • @baldr 是的,尝试了装饰器 app.task 和 shared_task - 同样的错误
  • @baldr 为什么在控制台中连来自 celery.py 的 debug_task 也没有显示?

标签: python django celery amqp kombu


【解决方案1】:

使用命令行中设置的显式路径调用您的 celery worker:

celery worker -A firstapp.celery

看来根本原因是:

  • Celery 连接到默认队列并接收消息
  • 此消息包含任务名称vk_wall.tasks.add
  • Celery 尝试在已知任务列表中查找此任务但失败

发生这种情况是因为您没有指定 celery 的设置源。它应该加载 Django 项目的设置或单独的设置文件。

【讨论】:

  • 当 celery worker -A firstapp.settings -l info 它抛出很长的错误结束' ImportError: No module named 'firstapp' '。上面添加了与 celery config 相关的 setting.py 数据
  • 尝试找出您尝试在源代码中导入firstapp 的位置。或者显示更多异常行
  • 再次更新:添加了调用 firstapp.settings 的 celery.py 文件
  • 来自 /var/www/firstapp 这是 django 项目的根目录
  • 等待.. 从您的输出中我看到您正在从/var/www/engine 运行它。是否包含firstapp 文件夹?
【解决方案2】:

已修复!正确的调用是:

celery worker -A 引擎 -l 调试

此外,如果在 settings.py 中我已将行更改为,则此调用有效

CELERY_IMPORTS=["vk_wall.tasks"]

在 celery.py(引擎而不是 firstapp)中:

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'engine.settings')

from django.conf import settings  # noqa

app = Celery('engine')

【讨论】:

  • 我猜你的项目中不再使用celery.py。仅当您明确导入时才会使用它。
猜你喜欢
  • 2022-07-19
  • 2016-01-01
  • 1970-01-01
  • 2021-04-08
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多