Saltar al contenido

Django and Celery: recarga de código en Celery después de un cambio

Solución:

Desafortunadamente --autoreload no funciona y está en desuso.

Puede usar Watchdog, que proporciona a watchmedo una utilidad de shell para realizar acciones basadas en eventos de archivos.

pip install watchdog

Puedes empezar a trabajar con

watchmedo auto-restart -- celery worker -l info -A foo

De forma predeterminada, buscará todos los archivos en el directorio actual. Estos se pueden cambiar pasando los parámetros correspondientes.

watchmedo auto-restart -d . -p '*.py' -- celery worker -l info -A foo

Agregar -R opción para ver los archivos de forma recursiva.

Si está usando django y no quiere depender de un perro guardián, hay un truco simple para lograrlo. Django tiene una utilidad de recarga automática que utiliza runserver para reiniciar el servidor WSGI cuando cambia el código.

La misma funcionalidad se puede utilizar para recargar los trabajadores de apio. Cree un comando de gestión independiente llamado apio. Escriba una función para matar a un trabajador existente y comenzar un nuevo trabajador. Ahora conecte esta función a la recarga automática de la siguiente manera. Para Django> = 2.2

import sys

import shlex
import subprocess
from django.core.management.base import BaseCommand
from django.utils import autoreload


class Command(BaseCommand):
    def handle(self, *args, **options):
        autoreload.run_with_reloader(self._restart_celery)

    @classmethod
    def _restart_celery(cls):
        if sys.platform == "win32":
            cls.run('taskkill /f /t /im celery.exe')
            cls.run('celery -A phoenix worker --loglevel=info --pool=solo')
        else:  # probably ok for linux2, cygwin and darwin. Not sure about os2, os2emx, riscos and atheos
            cls.run('pkill celery')
            cls.run('celery worker -l info -A foo')

    @staticmethod
    def run(cmd):
        subprocess.call(shlex.split(cmd))

Para django <2.2

import sys

import shlex
import subprocess
from django.core.management.base import BaseCommand
from django.utils import autoreload


class Command(BaseCommand):
    def handle(self, *args, **options):
        autoreload.main(self._restart_celery)

    @classmethod
    def _restart_celery(cls):
        if sys.platform == "win32":
            cls.run('taskkill /f /t /im celery.exe')
            cls.run('celery -A phoenix worker --loglevel=info --pool=solo')
        else:  # probably ok for linux2, cygwin and darwin. Not sure about os2, os2emx, riscos and atheos
            cls.run('pkill celery')
            cls.run('celery worker -l info -A foo')

    @staticmethod
    def run(cmd):
        subprocess.call(shlex.split(cmd))

Ahora puedes ejecutar apio trabajador con python manage.py celery que se recargará automáticamente cuando cambie la base de código.

Esto es solo para fines de desarrollo y no lo use en producción.

Puede probar SIGHUP en el proceso del trabajador principal, reinicia el trabajador, pero no estoy seguro de si detecta nuevas tareas. Vale la pena intentarlo, pensó 🙂

Para su información, para cualquiera que use Docker, no pude encontrar una manera fácil de hacer que las opciones anteriores funcionen, pero encontré (junto con otros) otro pequeño script aquí que usa watchdog y funciona perfectamente.

Guárdalo como some_name.py archivo en su directorio principal, agregue pip install psutil y watchdog a requirements.txt, actualice las variables de ruta / cmdline en la parte superior, luego en el contenedor de trabajo de su inserción docker-compose.yml:

command: python ./some_name.py
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *