Search code examples
djangocelerydjango-celerycelerybeatperiodic-task

Am I executing celery shared tasks correct?


Here is the way how I start celery periodic tasks. First I execute this command:

celery worker -A my_project.celery

And after that this command:

celery -A my_project beat -l info -S django

After executing these two commands on two different terminal tabs, my celery beat periodic tasks starts running. If I don't run one of the described commands, my periodic tasks do not run. My question is: is there any any way to start the celery with the single command, or even better with runserver command?


Solution

  • Your method of using Celery is correct. You can use parameter -B, --beat to start beat and worker using single command:

    # This will start worker AND beat process
    celery worker --app=my_project -l=INFO --beat -S django
    

    But do not use this in production, see this note in Celery docs (http://docs.celeryproject.org/en/latest/reference/celery.bin.worker.html):

    -B is meant to be used for development purposes. For production environment, you need to start celery beat separately.

    Few notes: 1) I think there is no way to run the Celery and runserver together (I honestly think it's not a good idea); 2) I see django-celery tag in your question. This is and old and deprecated way of integrating Django and Celery:

    THIS PROJECT IS ONLY REQUIRED IF YOU WANT TO USE DJANGO RESULT BACKEND AND ADMIN INTEGRATION (Source: https://github.com/celery/django-celery)