您好,登錄后才能下訂單哦!
經常用python開發web應用時,會涉及到定時任務的腳本,以前用linux自帶的crontab來操作,但是感覺不太接地氣,后來發現用celery+django 可以方便的實現!
安裝軟件環境如下:
python 2.7.5
Django==1.8.2
celery==3.1.18
celery-with-redis==3.0
django-celery==3.1.16
MySQL-python==1.2.3
supervisor==3.1.3
使用pip方式安裝完以上軟件,并且默認系統已經安裝了redis和mysql服務器!
一 首先創建project:
django-admin.py createproject picha
然后創建名稱為demo的app:
django-admin.py startapp demo
項目的目錄結構為:
二 下面在settings文件中配置celery相關的配置:
# CELERY STUFF import djcelery djcelery.setup_loader() BROKER_URL = 'redis://localhost:6379' CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler' # 定時任務 CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' CELERY_RESULT_BACKEND = 'redis://localhost:6379' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Asia/Shanghai'
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'demo', 'djcelery', )
在和settings.py同級目錄中編輯文件 |__init__.py
#! /usr/bin/env python # coding: utf-8 from __future__ import absolute_import # This will make sure the app is always imported when # Django starts so that shared_task will use this app. from .celery import app as celery_app
然后修改市區:
TIME_ZONE = 'Asia/Shanghai'
市區不對,計劃任務是不會按時間執行的!
另外,我們還需要在創建一個celery.py文件,他會自動發現我們app下面的task!
#! /usr/bin/env python # coding: utf-8 from __future__ import absolute_import import os from celery import Celery from django.conf import settings # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'picha.settings') app = Celery('picha') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) @app.task(bind=True) def debug_task(self): print('Request: {0!r}'.format(self.request))
現在我們在demo的app下面創建測試用的task!
from __future__ import absolute_import from celery import shared_task,task @shared_task() def add(x,y): # return x + y print x + y @shared_task() def mul(x,y): print "%d * %d = %d" %(x,y,x*y) return x*y @shared_task() def sub(x,y): print "%d - %d = %d"%(x,y,x-y) return x - y @task(ignore_result=True,max_retries=1,default_retry_delay=10) def just_print(): print "Print from celery task"
到這里,django和celery部分已經安裝完成!
三 我現在開始配置supervisor,用來啟動相關celery程序:
1)初始化supervisor配置文件!
echo_supervisord_conf > /etc/supervisord.conf
2)然后在supervisord.conf文件末尾添加如下配置:
[program:djangoproject.celeryd] command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celeryd --concurrency=1 user=root numprocs=1 directory=/usr/local/coding/pythoner/picha stdout_logfile=/var/log/celery_worker.log stderr_logfile=/var/log/celery_worker.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 120 priority=998 [program:djangoproject.celerybeat] command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celery beat --schedule=/tmp/celerybeat-schedule --pidfile=/tmp/django_celerybeat.pid --loglevel=INFO user=root numprocs=1 directory=/usr/local/coding/pythoner/picha stdout_logfile=/var/log/celery_beat.log stderr_logfile=/var/log/celery_beat.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 120 priority=998 [program:djangoproject.celerycam] command=/usr/local/pyenv/shims/python /usr/local/coding/pythoner/picha/manage.py celerycam --frequency=10.0 user=root numprocs=1 directory=/usr/local/coding/pythoner/picha stdout_logfile=/var/log/celerycam.log stderr_logfile=/var/log/celerycam.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 120 priority=998
四 現在我們需要把celery相關的庫文件同步到mysql中,我們使用命令:
python manage.py syncdb
然后創建superuser
django-admin manage.py createsuperuser
啟動supervisor:
supervisord -d
查看服務是否啟動成功,使用命令supervisorctl status
djangoproject.celerybeat RUNNING pid 3061, uptime 1:03:27
djangoproject.celerycam RUNNING pid 3063, uptime 1:03:27
djangoproject.celeryd RUNNING pid 3062, uptime 1:03:27
然后我們進入到django-admin后臺,
現在我們啟動django:
python manage.py runserver 0.0.0.0:8008
進入后臺后,點擊“Periodic tasks”:
可以看到寫在tasks.py下面的方法,在下拉菜單中都出現了,我們只用選擇對應的時間即可!
現在,我們開始選擇計劃任務的時間:
我們創建一個定時任務,沒10s,print一個數值,放在在日志文件中查看:
我們查看日志文件:
符合我們在web后臺的設置!
我們在設置一個加法運算,每隔15s運行一次,而且我們可以在web平臺后端動態的修改所傳的參數,
第一次,我們傳入參數9和5,結果應該為14,我們看下設置和日志:
我再看下日志:
然后我們在web后臺修改傳入參數為10和7,不重啟服務,計算的結果動態變化為17!
我們發現,結果數據已經動態變化!
我們如果啟動了 supervisor腳本中的:/usr/local/coding/pythoner/picha/manage.py celerycam --frequency=10.0
就可以在admin后臺查看 woker是不是在線:
celery-django相關的配置就完成了!
PS:配置過程中計劃任務的結果只能日志中查看,不知道怎么在admin的后臺中顯示,如果大家知道,可以告訴我,3Q!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。