中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

利用celery+django 在admin后臺設置定時任務

發布時間:2020-07-20 19:43:18 來源:網絡 閱讀:24277 作者:shine_forever 欄目:開發技術

經常用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

項目的目錄結構為:

利用celery+django 在admin后臺設置定時任務


二 下面在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下面的方法,在下拉菜單中都出現了,我們只用選擇對應的時間即可!

利用celery+django 在admin后臺設置定時任務

現在,我們開始選擇計劃任務的時間:

我們創建一個定時任務,沒10s,print一個數值,放在在日志文件中查看:

利用celery+django 在admin后臺設置定時任務

我們查看日志文件:

利用celery+django 在admin后臺設置定時任務符合我們在web后臺的設置!


我們在設置一個加法運算,每隔15s運行一次,而且我們可以在web平臺后端動態的修改所傳的參數,

第一次,我們傳入參數9和5,結果應該為14,我們看下設置和日志:

利用celery+django 在admin后臺設置定時任務

我再看下日志:

利用celery+django 在admin后臺設置定時任務


然后我們在web后臺修改傳入參數為10和7,不重啟服務,計算的結果動態變化為17!

利用celery+django 在admin后臺設置定時任務

我們發現,結果數據已經動態變化!


我們如果啟動了 supervisor腳本中的:/usr/local/coding/pythoner/picha/manage.py celerycam --frequency=10.0

就可以在admin后臺查看 woker是不是在線:

利用celery+django 在admin后臺設置定時任務celery-django相關的配置就完成了!


PS:配置過程中計劃任務的結果只能日志中查看,不知道怎么在admin的后臺中顯示,如果大家知道,可以告訴我,3Q!



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳春市| 宜兰市| 固原市| 黄龙县| 黄平县| 宜都市| 陵水| 瓮安县| 六安市| 汤原县| 年辖:市辖区| 炉霍县| 临漳县| 阜宁县| 万盛区| 大足县| 田东县| 中阳县| 翁牛特旗| 贵溪市| 亳州市| 明光市| 南陵县| 新野县| 苍山县| 榆树市| 依安县| 囊谦县| 九寨沟县| 樟树市| 民县| 兴海县| 莱芜市| 商洛市| 亳州市| 铜梁县| 丰镇市| 芦溪县| 新兴县| 阿克| 阿拉善右旗|