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