Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In celery 3.1, making django periodic task

Things changed too much in Django, so I can't use 3.1. I need some help.

I read about make a task in django, and read Periodic Tasks document. But I don't know how make periodic tasks in django. I think this becuase of my low level English..

In the older version of Celery, I imported djcelery&crontab and set CELERYBEAT_SCHEDULE in settings.py, and excuted by manage.py.

But it seems that I cannot execute celery deamon by that way anymore. Than where I should put CELERYBEAT_SCHEDULE? In django example in docs, they set os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') in proj/proj/celery.py. (1) So setting celerybeat in settings.py(like before) is ok?

(2) If you can, a tiny example of making periodic task in django will very helpful. When I was reading tutorials, the most confusing part was File Path. If you don't want to provide a whole example, I will really appreciate if you explain about where I should make tasks, set beat, and executed deamon.

Thanks for reading.

like image 664
margincall Avatar asked Nov 21 '13 09:11

margincall


People also ask

How do you create a periodic task in django?

We can configure periodic tasks either by manually adding the configurations to the celery.py module or using the django-celery-beat package which allows us to add periodic tasks from the Django Admin by extending the Admin functionality to allow scheduling tasks.

How do I schedule a task in django celery?

First, open a new shell or window. In that shell, set up the same Django development environment - activate your virtual environment, or add things to your Python path, whatever you do so that you could use runserver to run your project.

What is periodic task in django?

About. This extension enables you to store the periodic task schedule in the database. The periodic tasks can be managed from the Django Admin interface, where you can create, edit and delete periodic tasks and how often they should run.


2 Answers

I assume you've already read the django section from the docs, but have you seen this example project?

It doesn't use the scheduler but if you add this to settings.py:

from __future__ import absolute_import  from celery.schedules import crontab   CELERYBEAT_SCHEDULE = {     # crontab(hour=0, minute=0, day_of_week='saturday')     'schedule-name': {  # example: 'file-backup'          'task': 'some_django_app.tasks....',  # example: 'files.tasks.cleanup'          'schedule': crontab(...)     }, }  # if you want to place the schedule file relative to your project or something: CELERYBEAT_SCHEDULE_FILENAME = "some/path/and/filename" 

Now for the commands, forget about manage.py, just type celery directly:

-B enables celery beat as always.

-A specifies the name of the celery app. Note this line in the celery.py of the example project: app = Celery('proj')

celery -A proj worker -B -l info 

'django-celery' is not required, install it ONLY if you need to manage the schedule from the admin, or if you want to store task results in the DB through django's ORM:

INSTALLED_APPS += ('djcelery',)  # store schedule in the DB: CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' 
like image 97
Adrián Avatar answered Sep 21 '22 17:09

Adrián


You can use django-celery application: https://pypi.python.org/pypi/django-celery

Installation:

pip install django-celery 

To enable django-celery for your project you need to add djcelery to INSTALLED_APPS:

INSTALLED_APPS += ("djcelery", ) CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler" 

then add the following lines to your settings.py:

import djcelery djcelery.setup_loader() 

USAGE

On linux you can run worker with celery-beat like this:

python manage.py celeryd worker --loglevel=DEBUG  -E -B -c 1 python manage.py help celeryd #to find out the args meaning 

Also you will like to monitor tasks in django admin. To enable monitoring fiture you'll need to run celerycam:

python /var/www/gorod/manage.py celerycam 

To make periodic task you can use celery.decorators.periodic_task.

# myapp/tasks.py import datetime import celery  @celery.decorators.periodic_task(run_every=datetime.timedelta(minutes=5)) def myfunc():     print 'periodic_task' 

Or use

# settings.py CELERYBEAT_SCHEDULE = {     'add-every-30-seconds': {         'task': 'tasks.add',         'schedule': timedelta(seconds=30),         'args': (16, 16)     }, } 
like image 28
Yevgeniy Shchemelev Avatar answered Sep 20 '22 17:09

Yevgeniy Shchemelev