Для того чтобы 'адекватно' отладить Celery из-под Windows существует несколько путей таких как:
Но, по факту для нормальной разработки нужна Unix-система. Если у Вас нет возможности использовать её как родную, то стоит задуматься…) Ну а если честно, то выход всегда есть и это Docker, а также WSL. Если Вы используете такие «крутые» IDE, как PyCharm, то всё так же усложняется, ведь тогда при использовании интерпретатора с источником из WSL после установки пакета через pip скелет проекта придётся обновлять вручную из-за проблем с индексацией.
Но с Docker все по-другому. Для крутого менеджмента нам понадобится Windows 10 Pro, так как Home-версия не поддерживает виртуализацию.
Теперь устанавливаем и проверяем Docker. После того как это произойдет в трее, появится соответствующий значок.
![image](https://habrastorage.org/webt/pb/7i/ys/pb7iysypwuwvvmaleaamwqnxzvk.png)
Дальше создаем и запускаем проект на Django. Здесь я использую версию 2.2. Будет структура, похожа на такую:
![image](https://habrastorage.org/webt/yh/bt/8k/yhbt8kzaulz5qtme6j0bklias0m.png)
После устанавливаем Celery and Redis в качестве брокера.
Теперь добавим немного кода для проверки:
Добавим новое django-приложение в котором будут наши задачи и добавим новый файл:
Далее создаём Dockerfile и docker-compose.yml в корне проекта:
И стартуем!
![image](https://habrastorage.org/webt/cq/ns/gv/cqnsgvm4l-aipkp1xkzgv0vdfc0.png)
Дожидаемся установки всех зависимостей в pipenv-окружение. В конце вы должны будете увидеть что-то похоже на это:
![image](https://habrastorage.org/webt/vt/s8/p1/vts8p1keajxsof32yd96qau9jcm.png)
Это значит, что все круто! Осуществлять контроль можно с командной строки:
![image](https://habrastorage.org/webt/da/of/4-/daof4-dwmegxrm6ifjnmxjigrqq.png)
![image](https://habrastorage.org/webt/kk/ph/wq/kkphwqomnanzo_takxcjysjnwl0.png)
Как видим у 2 образов, которые были созданы из одного Dockerfile один ID.
Но так же управлять контейнерами можно с помощью GUI:
![image](https://habrastorage.org/webt/xp/99/v0/xp99v0yz_vca3vmzvbsdbdpq0k0.jpeg)
![image](https://habrastorage.org/webt/g2/ik/gu/g2ikguy5eqeugm2p4madojn-b2i.jpeg)
Таким вот образом можно легко включать/выключать, перезапускать, удалять контейнера.
![image](https://habrastorage.org/webt/sm/e7/wg/sme7wgkzs7lq-is5wfxyymvmaes.png)
> celery worker --app=demo_app.core --pool=solo --loglevel=INFO
Но, по факту для нормальной разработки нужна Unix-система. Если у Вас нет возможности использовать её как родную, то стоит задуматься…) Ну а если честно, то выход всегда есть и это Docker, а также WSL. Если Вы используете такие «крутые» IDE, как PyCharm, то всё так же усложняется, ведь тогда при использовании интерпретатора с источником из WSL после установки пакета через pip скелет проекта придётся обновлять вручную из-за проблем с индексацией.
Но с Docker все по-другому. Для крутого менеджмента нам понадобится Windows 10 Pro, так как Home-версия не поддерживает виртуализацию.
Теперь устанавливаем и проверяем Docker. После того как это произойдет в трее, появится соответствующий значок.
![image](https://habrastorage.org/webt/pb/7i/ys/pb7iysypwuwvvmaleaamwqnxzvk.png)
Дальше создаем и запускаем проект на Django. Здесь я использую версию 2.2. Будет структура, похожа на такую:
![image](https://habrastorage.org/webt/yh/bt/8k/yhbt8kzaulz5qtme6j0bklias0m.png)
После устанавливаем Celery and Redis в качестве брокера.
Теперь добавим немного кода для проверки:
# core/settings.py
CELERY_BROKER_URL = 'redis://demo_app_redis:6379'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
# core/celery.py
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
app = Celery('core')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
# core/__init__.py
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ('celery_app',)
Добавим новое django-приложение в котором будут наши задачи и добавим новый файл:
# app/tasks.py
from celery.task import periodic_task
from datetime import timedelta
@periodic_task(run_every=(timedelta(seconds=5)), name='hello')
def hello():
print("Hello there")
Далее создаём Dockerfile и docker-compose.yml в корне проекта:
# Dockerfile
FROM python:3.7
RUN pip install pipenv
RUN mkdir /code
WORKDIR /code
COPY Pipfile* /code/
RUN pipenv install --system --deploy --ignore-pipfile
ADD core /code/
# docker-compose.yml
version: '3'
services:
redis:
image: redis
restart: always
container_name: 'demo_app_redis'
command: redis-server
ports:
- '6379:6379'
web:
build: .
restart: always
container_name: 'demo_app_django'
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- '8000:8000'
celery:
build: .
container_name: 'demo_app_celery'
command: celery -A core worker -B
volumes:
- .:/code
links:
- redis
depends_on:
- web
- redis
И стартуем!
![image](https://habrastorage.org/webt/cq/ns/gv/cqnsgvm4l-aipkp1xkzgv0vdfc0.png)
Дожидаемся установки всех зависимостей в pipenv-окружение. В конце вы должны будете увидеть что-то похоже на это:
![image](https://habrastorage.org/webt/vt/s8/p1/vts8p1keajxsof32yd96qau9jcm.png)
Это значит, что все круто! Осуществлять контроль можно с командной строки:
![image](https://habrastorage.org/webt/da/of/4-/daof4-dwmegxrm6ifjnmxjigrqq.png)
![image](https://habrastorage.org/webt/kk/ph/wq/kkphwqomnanzo_takxcjysjnwl0.png)
Как видим у 2 образов, которые были созданы из одного Dockerfile один ID.
Но так же управлять контейнерами можно с помощью GUI:
![image](https://habrastorage.org/webt/xp/99/v0/xp99v0yz_vca3vmzvbsdbdpq0k0.jpeg)
![image](https://habrastorage.org/webt/g2/ik/gu/g2ikguy5eqeugm2p4madojn-b2i.jpeg)
Таким вот образом можно легко включать/выключать, перезапускать, удалять контейнера.
![image](https://habrastorage.org/webt/sm/e7/wg/sme7wgkzs7lq-is5wfxyymvmaes.png)
a1ia5
Бряк внутри таска не поставить. Уныло отлаживать принтами такое себе решение.
parfeniukink Автор
Так никто и не говорит о принтах… Это для примера. Здесь говорится о том что Celery под виндой нормально не работает. И докер как решение. А принты это просто для примера.