Python-Celery dans Windows avec gestion Docker

Afin de déboguer « correctement » Celery sous Windows, il existe plusieurs façons telles que:

> celery worker --app=demo_app.core --pool=solo --loglevel=INFO

Mais, en fait, pour un développement normal, vous avez besoin d'un système Unix. Si vous n'avez pas la possibilité de l'utiliser en tant que natif, alors cela vaut la peine d'être considéré ...) Eh bien, pour être honnête, il y a toujours une issue et c'est Docker, ainsi que WSL. Si vous utilisez des IDE «cool» comme PyCharm, tout devient plus compliqué, car lorsque vous utilisez l'interpréteur avec une source de WSL, après avoir installé le package via pip, vous devrez mettre à jour manuellement le squelette du projet en raison de problèmes d'indexation.

Mais avec Docker, tout est différent. Pour une bonne gestion, nous aurons besoin de Windows 10 Pro, car la version Home ne prend pas en charge la virtualisation.

Maintenant, installez et testez Docker . Après cela dans le bac, l'icône correspondante apparaîtra.

image

Ensuite, nous créons et exécutons le projet sur Django. Ici, j'utilise la version 2.2. Il y aura une structure similaire à ceci:

image

Après avoir installé Celery et Redis en tant que courtier.

Ajoutez maintenant du code pour vérifier:

# 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',)

Ajoutez une nouvelle application django dans laquelle seront nos tâches et ajoutez un nouveau fichier:

# 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")

Ensuite, créez un Dockerfile et docker-compose.yml à la racine du projet:

# 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

Et commence!

image

Nous attendons l'installation de toutes les dépendances dans l'environnement pipenv. En fin de compte, vous devriez voir quelque chose comme ceci:

image

Cela signifie que tout est cool ! Vous pouvez contrôler à partir de la ligne de commande:

image

image

Comme vous pouvez le voir, 2 images qui ont été créées à partir d'un Dockerfile ont un ID.

Mais vous pouvez également gérer les conteneurs à l'aide de l'interface graphique:

image

image

De cette façon, vous pouvez facilement activer / désactiver, redémarrer, supprimer le conteneur.

image

All Articles