电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Django+Celery實現(xiàn)定時任務的示例

瀏覽:36日期:2024-09-04 08:19:57
目錄一、前言二、配置使用定義與觸發(fā)任務擴展三、Django中使用定時任務二次開發(fā)一、前言

Celery是一個基于python開發(fā)的分布式任務隊列,而做python WEB開發(fā)最為流行的框架莫屬Django,但是Django的請求處理過程都是同步的無法實現(xiàn)異步任務,若要實現(xiàn)異步任務處理需要通過其他方式(前端的一般解決方案是ajax操作),而后臺Celery就是不錯的選擇。倘若一個用戶在執(zhí)行某些操作需要等待很久才返回,這大大降低了網(wǎng)站的吞吐量。

​另一方面,當我們需要處理一些定時任務時Celery強大的生態(tài)環(huán)境也是他的優(yōu)勢。

​在剛剛學習如何使用Celery時可能會覺得難以入手,我利用工作之余研究這些文檔前前后后也花了快一個周的樣子,目前已經(jīng)可以滿足我的需求,所以靜下心多寫多測試,加油。

Django+Celery實現(xiàn)定時任務的示例

二、配置使用

celery很容易集成到Django框架中,當然如果想要實現(xiàn)定時任務的話還需要安裝django-celery-beta插件,后面會說明。需要注意的是Celery4.0只支持Django版本>=1.8的,如果是小于1.8版本需要使用Celery3.1。

本示例使用主要依賴包如下:

celery==4.2.1Django==1.11.7django-celery-beat==1.4.0django-celery-results==1.0.4PyMySQL==0.9.2redis==2.10.6

配置

新建立項目celery_demo,目錄結構(每個app下多了個tasks文件,用于定義任務):

celery_demo├── app01│ ├── __init__.py│ ├── apps.py│ ├── migrations│ │ └── __init__.py│ ├── models.py│ ├── tasks.py│ └── views.py├── manage.py├── celery_demo│ ├── __init__.py│ ├── settings.py│ ├── urls.py│ └── wsgi.py└── templates

在項目目錄celery_demo/celery_demo/目錄下新建celery.py:

#!/usr/bin/env python3# -*- coding:utf-8 -*-# Author:wdfrom __future__ import absolute_import, unicode_literalsimport osfrom celery import Celery# 設置django環(huán)境os.environ.setdefault(’DJANGO_SETTINGS_MODULE’, ’celery_demo.settings’) app = Celery(’celery_demo’)# 使用CELERY_ 作為前綴,在settings中寫配置app.config_from_object(’django.conf:settings’, namespace=’CELERY’) # 發(fā)現(xiàn)任務文件每個app下的task.pyapp.autodiscover_tasks()

在celery_demo/celery_demo/__init__.py寫入:

from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = [’celery_app’]

在celery_demo/celery_demo/settings.py寫入:

CELERY_BROKER_URL = ’redis://10.1.210.69:6379/0’ # Broker配置,使用Redis作為消息中間件CELERY_RESULT_BACKEND = ’redis://10.1.210.69:6379/0’ # BACKEND配置,這里使用redisCELERY_RESULT_SERIALIZER = ’json’ # 結果序列化方案

進入項目的celery_demo目錄啟動worker:

celery worker -A taskproj -l debug定義與觸發(fā)任務

任務定義在每個tasks文件中,app01/tasks.py:

from __future__ import absolute_import, unicode_literalsfrom celery import shared_task@shared_taskdef add(x, y): return x + y@shared_taskdef mul(x, y): return x * y

視圖中觸發(fā)任務

from django.http import JsonResponsefrom app01 import tasks# Create your views here.def index(request,*args,**kwargs): res=tasks.add.delay(1,3) #任務邏輯 return JsonResponse({’status’:’successful’,’task_id’:res.task_id})

訪問http://127.0.0.1:8000/index

Django+Celery實現(xiàn)定時任務的示例

若想獲取任務結果,可以通過task_id使用AsyncResult獲取結果,還可以直接通過backend獲取:

Django+Celery實現(xiàn)定時任務的示例

擴展

除了redis、rabbitmq能做結果存儲外,還可以使用Django的orm作為結果存儲,當然需要安裝依賴插件,這樣的好處在于我們可以直接通過django的數(shù)據(jù)查看到任務狀態(tài),同時為可以制定更多的操作,下面介紹如何使用orm作為結果存儲。

安裝

pip install django-celery-results

配置settings.py,注冊app

INSTALLED_APPS = ( ..., ’django_celery_results’,)

修改backend配置,將Redis改為django-db

#CELERY_RESULT_BACKEND = ’redis://10.1.210.69:6379/0’ # BACKEND配置,這里使用redisCELERY_RESULT_BACKEND = ’django-db’ #使用django orm 作為結果存儲

修改數(shù)據(jù)庫

python3 manage.py migrate django_celery_results

此時會看到數(shù)據(jù)庫會多創(chuàng)建:

Django+Celery實現(xiàn)定時任務的示例

當然你有時候需要對task表進行操作,以下源碼的表結構定義:

class TaskResult(models.Model): '''Task result/status.''' task_id = models.CharField(_(’task id’), max_length=255, unique=True) task_name = models.CharField(_(’task name’), null=True, max_length=255) task_args = models.TextField(_(’task arguments’), null=True) task_kwargs = models.TextField(_(’task kwargs’), null=True) status = models.CharField(_(’state’), max_length=50, default=states.PENDING, choices=TASK_STATE_CHOICES ) content_type = models.CharField(_(’content type’), max_length=128) content_encoding = models.CharField(_(’content encoding’), max_length=64) result = models.TextField(null=True, default=None, editable=False) date_done = models.DateTimeField(_(’done at’), auto_now=True) traceback = models.TextField(_(’traceback’), blank=True, null=True) hidden = models.BooleanField(editable=False, default=False, db_index=True) meta = models.TextField(null=True, default=None, editable=False) objects = managers.TaskResultManager() class Meta:'''Table information.'''ordering = [’-date_done’]verbose_name = _(’task result’)verbose_name_plural = _(’task results’) def as_dict(self):return { ’task_id’: self.task_id, ’task_name’: self.task_name, ’task_args’: self.task_args, ’task_kwargs’: self.task_kwargs, ’status’: self.status, ’result’: self.result, ’date_done’: self.date_done, ’traceback’: self.traceback, ’meta’: self.meta,} def __str__(self):return ’<Task: {0.task_id} ({0.status})>’.format(self)三、Django中使用定時任務

如果想要在django中使用定時任務功能同樣是靠beat完成任務發(fā)送功能,當在Django中使用定時任務時,需要安裝django-celery-beat插件。以下將介紹使用過程。

安裝配置

1.beat插件安裝

pip3 install django-celery-beat

2.注冊APP

INSTALLED_APPS = [ .... ’django_celery_beat’,]

3.數(shù)據(jù)庫變更

python3 manage.py migrate django_celery_beat

4.分別啟動woker和beta

celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler #啟動beta 調度器使用數(shù)據(jù)庫celery worker -A taskproj -l info #啟動woker

5.配置admin

在urls.py寫入:

# urls.pyfrom django.conf.urls import urlfrom django.contrib import admin urlpatterns = [ url(r’^admin/’, admin.site.urls),]

6.創(chuàng)建用戶

python3 manage.py createsuperuser

7.登錄admin進行管理(地址http://127.0.0.1:8000/admin)并且還可以看到我們上次使用orm作為結果存儲的表。

http://127.0.0.1:8000/admin/login/?next=/admin/

Django+Celery實現(xiàn)定時任務的示例

使用示例:

Django+Celery實現(xiàn)定時任務的示例

Django+Celery實現(xiàn)定時任務的示例

查看結果:

Django+Celery實現(xiàn)定時任務的示例

二次開發(fā)

django-celery-beat插件本質上是對數(shù)據(jù)庫表變化檢查,一旦有數(shù)據(jù)庫表改變,調度器重新讀取任務進行調度,所以如果想自己定制的任務頁面,只需要操作beat插件的四張表就可以了。當然你還可以自己定義調度器,django-celery-beat插件已經(jīng)內置了model,只需要進行導入便可進行orm操作,以下我用django reset api進行示例:

settings.py

INSTALLED_APPS = [ ’django.contrib.admin’, ’django.contrib.auth’, ’django.contrib.contenttypes’, ’django.contrib.sessions’, ’django.contrib.messages’, ’django.contrib.staticfiles’, ’app01.apps.App01Config’, ’django_celery_results’, ’django_celery_beat’, ’rest_framework’,]

urls.py

urlpatterns = [ url(r’^admin/’, admin.site.urls), url(r’^index$’, views.index), url(r’^res$’, views.get_res), url(r’^tasks$’, views.TaskView.as_view({’get’:’list’})),]

views.py

from django_celery_beat.models import PeriodicTask #倒入插件modelfrom rest_framework import serializersfrom rest_framework import paginationfrom rest_framework.viewsets import ModelViewSetclass Userserializer(serializers.ModelSerializer): class Meta:model = PeriodicTaskfields = ’__all__’class Mypagination(pagination.PageNumberPagination): '''自定義分頁''' page_size=2 page_query_param = ’p’ page_size_query_param=’size’ max_page_size=4class TaskView(ModelViewSet): queryset = PeriodicTask.objects.all() serializer_class = Userserializer permission_classes = [] pagination_class = Mypagination

訪問http://127.0.0.1:8000/tasks如下:

Django+Celery實現(xiàn)定時任務的示例

參考資料:

W-D:https://www.cnblogs.com/wdliu/p/9530219.html

還在琢磨:https://blog.csdn.net/mbl114/article/details/78047175

Celery文檔:http://docs.celeryproject.org/en/latest/

以上就是Django+Celery實現(xiàn)定時任務的示例的詳細內容,更多關于Django Celery定時任務的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Django
相關文章:
主站蜘蛛池模板: 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 电镀整流器_微弧氧化电源_高频电解电源_微弧氧化设备厂家_深圳开瑞节能 | 废水处理-废气处理-工业废水处理-工业废气处理工程-深圳丰绿环保废气处理公司 | 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 济南网站策划设计_自适应网站制作_H5企业网站搭建_济南外贸网站制作公司_锐尚 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 上海物流公司,上海货运公司,上海物流专线-优骐物流公司 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 换网器_自动换网器_液压换网器--郑州海科熔体泵有限公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 医疗仪器模块 健康一体机 多参数监护仪 智慧医疗仪器方案定制 血氧监护 心电监护 -朗锐慧康 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | 苏州伊诺尔拆除公司_专业酒店厂房拆除_商场学校拆除_办公楼房屋拆除_家工装拆除拆旧 | 电销卡_稳定企业大语音卡-归属地可选-世纪通信 | 蓄电池回收,ups电池后备电源回收,铅酸蓄电池回收,机房电源回收-广州益夫铅酸电池回收公司 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 伺服电机维修、驱动器维修「安川|三菱|松下」伺服维修公司-深圳华创益 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | 武汉高低温试验机-现货恒温恒湿试验箱-高低温湿热交变箱价格-湖北高天试验设备 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 泰国试管婴儿_泰国第三代试管婴儿_泰国试管婴儿费用/多少钱_孕泰来 | 釜溪印象网络 - Powered by Discuz! | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 上海橡胶接头_弹簧减震器_金属软接头厂家-上海淞江集团 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 手持式浮游菌采样器-全排二级生物安全柜-浙江孚夏医疗科技有限公司 | 深圳网站建设-高端企业网站开发-定制网页设计制作公司 | 岩棉切条机厂家_玻璃棉裁条机_水泥基保温板设备-廊坊鹏恒机械 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | 智能门锁电机_智能门锁离合器_智能门锁电机厂家-温州劲力智能科技有限公司 |