@domanskiy

Celery не видит модуль. Как подключить celery к FastApi?

Есть проект на FastAPI
Пытаюсь прикрутить celery. Проблема в том, что image на докере не стартует.
Error: 
Unable to load celery application.
The module celery_worker was not found.


Структура проекта
docker-compose.yaml
Dockerfile
.env
requirements.txt
Находятся в корне.

\api\celery_worker.py
spoiler
"""celery module"""

import os

import time

#celery
from celery import Celery

celery = Celery(__name__)
celery.conf.broker_url = os.environ.get("CELERY_BROKER_URL", "redis://localhost:6379")
celery.conf.result_backend = os.environ.get("CELERY_RESULT_BACKEND", "redis://localhost:6379")


@celery.task(name="create_task")
def create_task1(arg1, arg2):
    time.sleep(int(arg1+arg2) * 2)
    return True


docker-compose.yaml
spoiler

version: "3.9"
services:
  db:
    image: registry.all-code.com:5000/custom-postgres
    build: ./custom-postgres
    restart: unless-stopped
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./custom-postgres/custom_postgresql.conf:/etc/postgresql.conf
    command: postgres -c config_file=/etc/postgresql.conf
    environment:
      - POSTGRES_DB=b2market_marketplace_development
      - POSTGRES_USER=b2market
      - POSTGRES_PASSWORD=postgres

  api_py:
    build: .
    restart: unless-stopped
    ports:
      - "5000:5000"
    depends_on:
      - db
    command: bash -c "cd b2market_marketplace && alembic upgrade head && uvicorn api.main:app --host 0.0.0.0 --port=5000 --reload"
    volumes:
      - /b2market_marketplace
      - ./alembic:/b2market_marketplace/alembic
      - ./api:/b2market_marketplace/api
    env_file:
      - .env

  worker:
    container_name: worker
    build: .
    restart: always
    command: celery -A celery_worker.celery worker --loglevel=INFO
    volumes:
      - /b2market_marketplace
      - ./api:/b2market_marketplace/api
    environment:
      - CELERY_BROKER_URL=redis://redis:6379/0
      - CELERY_RESULT_BACKEND=redis://redis:6379/0
    depends_on:
      - api_py
      - redis

  redis:
    container_name: redis
    image: redis:6.2-alpine



Не пойму, почему упорно не находит модуль celery_worker?
Я пробовал указывать api.celery_worker

В requirements.txt
celery==4.4.7
flower==0.9.7
redis==3.5.3

Пробовал вместо celery = Celery(__name__) писать celery = Celery("worker")
Не работает
Кто знает в чём проблема? Помогите пожалуйста!
  • Вопрос задан
  • 2024 просмотра
Решения вопроса 1
@domanskiy Автор вопроса
В итоге, рабочее решение:
61b0510541964306152675.png
Мне не совсем понятно как celery находит именно этот task.py
Но всё работает.
!!!Внимание
celery==4.4.7
flower==0.9.7
Для 5й версии celery, код запуска другой. Смотри документацию
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@rodion4dev
Неверно указан путь до приложения Celery в docker-compose.yaml в worker.command. Попробуйте celery_worker:celery, если папка api - всего лишь папка (не пакет python); иначе - api.celery_worker:celery
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы