проблема в настройке серверных задач сельдерея в Python

1

Я выполнил все шаги, приведенные в [ http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html ]. Это код:

from __future__ import absolute_import
from celery import Celery

#app = Celery('tasks', broker='pyamqp://guest@localhost//')
app = Celery('tasks', backend='redis://localhost', broker='pyamqp://guest@localhost//')
@app.task
def add(x, y):
   return x + y

Когда я запускаю работника сельдерея, используя следующую команду

celery -A tasks worker --loglevel=info

Я получаю синтаксическую ошибку для установки бэкэнд. Это сообщение об ошибке:

[2018-07-10 16:37:21,970: CRITICAL/MainProcess] Unrecoverable error: SyntaxError('invalid syntax', ('c:\\users\\user_\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\celery\\backends\\redis.py', 22, 19, 'from . import async, base\n'))Traceback (most recent call last):  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\kombu\utils\objects.py", line 42, in __get__    return obj.__dict__[self.__name__] KeyError: 'backend' During handling of the above exception, another exception occurred: Traceback (most recent call last):  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\worker\worker.py", line 205, in start self.blueprint.start(self)  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\bootsteps.py", line 115, in start self.on_start() File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\apps\worker.py", line 139, in on_start    self.emit_banner()  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\apps\worker.py", line 154, in emit_banner    ' \n', self.startup_info(artlines=not use_image))), File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\apps\worker.py", line 217, in startup_info    results=self.app.backend.as_uri(), File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\kombu\utils\objects.py", line 44, in __get__    value = obj.__dict__[self.__name__] = self.__get(obj) File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\base.py", line 1196, in backend    return self._get_backend()  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\base.py", line 914, in _get_backend    self.loader)  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\backends.py", line 70, in by_url    return by_name(backend, loader), url  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\app\backends.py", line 50, in by_name    cls = symbol_by_name(backend, aliases)  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\kombu\utils\imports.py", line 56, in symbol_by_name    module = imp(module_name, package=package, **kwargs)  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\importlib\__init__.py", line 127, in import_module    return _bootstrap._gcd_import(name[level:], package, level)  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import  File "<frozen importlib._bootstrap>", line 983, in _find_and_load  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked  File "<frozen importlib._bootstrap_external>", line 724, in exec_module  File "<frozen importlib._bootstrap_external>", line 860, in get_code  File "<frozen importlib._bootstrap_external>", line 791, in source_to_code  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed  File "c:\users\user_\appdata\local\programs\python\python37-32\lib\site-packages\celery\backends\redis.py", line 22    from . import async, base                      ^ SyntaxError: invalid syntax

Тем не менее, когда я использую прокомментированную строку, вместо этого у меня нет проблем, так что база данных результатов отключена, и мне нужно установить backend-сервер для redis-сервера

Теги:
python-3.x
redis
celery
redis-server

3 ответа

3
Лучший ответ

Я решил проблему. Основная причина проблемы заключалась в том, что я использовал Python 3.7. Но, насколько мне известно, сельдерей в настоящее время работает только с Python 2. Я внесла следующие изменения в код сельдерея:

  1. Переименовано "C:\Users\myusername\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\celery\backends\async.py" на "C:\Users\myusername\AppData\Local\Programs\Python\Python37-32\Lib\сайт-пакеты\сельдерей\движки\asynchronous.py"

  2. Открыл redis.py и изменил каждую строку с ключевым словом "async" на "асинхронный".

По-видимому,

асинхронной

теперь является ключевым словом в Python 3.

Вы также можете прочитать эту ссылку: https://github.com/celery/celery/issues/4500

Надеюсь, этот ответ поможет всем тем, у кого такая же проблема, пока не будет выпущена более новая версия Celery.


UPDATE: Это проблема Python 3.7. Вы можете использовать Python 3.6 вместо такой проблемы. Но, если вы хотите использовать Python 3.7 и сельдерей [redis], вы можете использовать вышеупомянутое решение для решения проблемы.

  • 0
    «В настоящее время Celery работает только с Python 2». Неправильно. Проблема с Python 3.7, а не с Python 3 в целом.
  • 0
    @CS Правильно! если вы используете Python 3.6, у вас не должно быть такой проблемы. Но в Python 3.7 есть проблема.
Показать ещё 2 комментария
1

support @Ai Da, и вы должны поддерживать AsyncBackendMixin в redis.py.

0

Вы пытались добавить порт redis и db в параметр backend? Или в файле конфигурации Celery, добавляющем параметры CELERY_REDIS_HOST CELERY_REDIS_PORT CELERY_REDIS_DB CELERY_RESULT_BACKEND CELERY_RESULT_PASSWORD

  • 0
    Где я могу найти файл конфигурации сельдерея? Я использую Windows.
  • 0
    Вы должны создать свой собственный файл для конфигураций приложения и вызвать их в своем основном файле сельдерея.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню