南昌做网站需要多少钱,wordpress批量定时自动发布文章,黑色门户网站源码,05网寒假作业目录Celery一、官方二、Celery异步任务框架Celery架构图消息中间件任务执行单元任务结果存储三、使用场景四、Celery的安装配置五、两种celery任务结构#xff1a;提倡用包管理#xff0c;结构更清晰七、Celery执行异步任务包架构封装八、基本使用celery.py 基本配置tasks.py… 目录Celery一、官方二、Celery异步任务框架Celery架构图消息中间件任务执行单元任务结果存储三、使用场景四、Celery的安装配置五、两种celery任务结构提倡用包管理结构更清晰七、Celery执行异步任务包架构封装八、基本使用celery.py 基本配置tasks.py 添加任务add_task.py 添加立即、延迟任务get_result.py 获取结果九、高级使用celery.py 定时任务配置(循环的)tasks.pyget_result.py十、django中使用(更新轮播图案例)redis的配置接口缓存views.py启动服务celery.pytasks.pyCelery一、官方Celery 官网http://www.celeryproject.org/Celery 官方文档英文版http://docs.celeryproject.org/en/latest/index.htmlCelery 官方文档中文版http://docs.jinkan.org/docs/celery/二、Celery异步任务框架1)可以不依赖任何服务器通过自身命令启动服务(内部支持socket)2)celery服务为为其他项目服务提供异步解决任务需求的注会有两个服务同时运行一个是项目服务一个是celery服务项目服务将需要异步处理的任务交给celery服务celery就会在需要时异步完成项目的需求人是一个独立运行的服务 | 医院也是一个独立运行的服务 正常情况下人可以完成所有健康情况的动作不需要医院的参与但当人生病时就会被医院接收解决人生病问题 人生病的处理方案交给医院来解决所有人不生病时医院独立运行人生病时医院就来解决人生病的需求Celery架构图Celery的架构由三部分组成消息中间件(message broker)、任务执行单元(worker)和 任务执行结果存储(task result store)组成。消息中间件Celery本身不提供消息服务但是可以方便的和第三方提供的消息中间件集成。包括RabbitMQ, Redis等等任务执行单元Worker是Celery提供的任务执行的单元worker并发的运行在分布式的系统节点中。任务结果存储Task result store用来存储Worker执行的任务的结果Celery支持以不同方式存储任务的结果包括AMQP, redis等三、使用场景异步执行解决耗时任务延迟执行解决延迟任务定时执行解决周期(周期)任务四、Celery的安装配置pip install celery消息中间件RabbitMQ/RedisappCelery(任务名, brokerxxx, backendxxx)五、两种celery任务结构提倡用包管理结构更清晰# 如果 Celery对象:Celery(...) 是放在一个模块下的# 1)终端切换到该模块所在文件夹位置scripts# 2)执行启动worker的命令celery worker -A 模块名 -l info -P eventlet# 注windows系统需要eventlet支持Linux与MacOS直接执行celery worker -A 模块名 -l info# 注模块名随意# 如果 Celery对象:Celery(...) 是放在一个包下的# 1)必须在这个包下建一个celery.py的文件将Celery(...)产生对象的语句放在该文件中# 2)执行启动worker的命令celery worker -A 包名 -l info -P eventlet# 注windows系统需要eventlet支持Linux与MacOS直接执行celery worker -A 模块名 -l info# 注包名随意放在根目录下就行七、Celery执行异步任务包架构封装project ├── celery_task # celery包 │ ├── __init__.py # 包文件 │ ├── celery.py # celery连接和配置相关文件且名字必须交celery.py │ └── tasks.py # 所有任务函数 ├── add_task.py # 添加任务 └── get_result.py # 获取结果八、基本使用celery.py 基本配置# 1)创建app 任务# 2)启动celery(app)服务# 非windows# 命令celery worker -A celery_task -l info# windows# pip3 install eventlet# celery worker -A celery_task -l info -P eventlet# 3)添加任务手动添加要自定义添加任务的脚本右键执行脚本# 4)获取结果手动获取要自定义获取任务的脚本右键执行脚本from celery import Celery# 无密码broker redis://127.0.0.1:6379/1 backend redis://127.0.0.1:6379/2# 有密码broker redis://:123127.0.0.1:6379/1backend redis://:123127.0.0.1:6379/2app Celery(brokerbroker, backendbackend, include[celery_task.tasks])broker : 任务仓库backend 任务结果仓库include 任务(函数)所在文件tasks.py 添加任务from .celery import appapp.taskdef add(n1,n2): res n1n2 print(n1n2 %s % res)return resapp.taskdef low(n1,n2): res n1-n2 print(n1-n2 %s % res)return resadd_task.py 添加立即、延迟任务from celery_task import tasks# delay 添加立即任务# apply_async 添加延迟任务# eta 执行的utc时间# 添加立即执行任务t1 tasks.add.delay(10, 20)t2 tasks.low.delay(100, 50)print(t1.id)# 添加延迟任务from celery_package.tasks import jumpfrom datetime import datetime,timedelta# 秒def eta_second(second): ctime datetime.now() # 当前时间 utc_ctime datetime.utcfromtimestamp(ctime.timestamp()) # 当前UTC时间 time_delay timedelta(secondssecond) # 秒return utc_ctime time_delay # 当前时间往后延迟的秒# 天def eta_days(days): ctime datetime.now() # 当前时间 utc_ctime datetime.utcfromtimestamp(ctime.timestamp()) # 当前UTC时间 time_delay timedelta(daysdays) # 天return utc_ctime time_delay # 当前时间往后延迟的天jump.apply_async(args(20,5), etaeta_second(10)) # 10秒后执行jump.apply_async(args(20,5), etaeta_days(1)) # 1天后执行get_result.py 获取结果from celery_task.celery import appfrom celery.result import AsyncResultid 21325a40-9d32-44b5-a701-9a31cc3c74b5if __name__ __main__:async AsyncResult(idid, appapp)if async.successful(): result async.get() print(result)elif async.failed(): print(任务失败)elif async.status PENDING: print(任务等待中被执行)elif async.status RETRY: print(任务异常后正在重试)elif async.status STARTED: print(任务已经开始被执行)九、高级使用celery.py 定时任务配置(循环的)特点添加任务的终端关闭之后停止添加celery服务端关闭后把关闭之后未执行的任务都执行一遍然后继续接收任务# 1)创建app 任务# 2)启动celery(app)服务# 注)-A 表示相对路径所以一定先进入celery_task所在包 -l 表示打印到日志 info 级别# 非windows# 命令celery worker -A celery_task -l info# windows# pip3 install eventlet# celery worker -A celery_task -l info -P eventlet# 3)添加任务自动添加任务所以要启动一个添加任务的服务# 命令celery beat -A celery_task -l info# 4)获取结果from celery import Celery# 无密码broker redis://127.0.0.1:6379/1 backend redis://127.0.0.1:6379/2# 有密码broker redis://:123127.0.0.1:6379/1backend redis://:123127.0.0.1:6379/2app Celery(brokerbroker, backendbackend, include[celery_task.tasks])# 时区app.conf.timezone Asia/Shanghai# 是否使用UTCapp.conf.enable_utc False# 自动任务的定时配置from datetime import timedeltafrom celery.schedules import crontabapp.conf.beat_schedule {# 定时任务名字fall_task: {task: celery_task.tasks.fall,args:(30,20),schedule: timedelta(seconds3), # 3秒后执行# schedule: crontab(hour8, day_of_week1), # 每周一早八点 }}fall_task任务名自定义task:任务来源args:任务参数schedule定时时间schedule: crontab(hour8, day_of_week1), # 每周一早八点minute : 分钟hour 小时day_of_week 礼拜day_of_month:月month_of_year:年tasks.pyfrom .celery import appapp.taskdef fall(n1,n2): res n1/n2 print(n1 /n2 %s % res)return resget_result.pyfrom celery_task.celery import appfrom celery.result import AsyncResultid 21325a40-9d32-44b5-a701-9a31cc3c74b5if __name__ __main__:async AsyncResult(idid, appapp)if async.successful(): result async.get() print(result)elif async.failed(): print(任务失败)elif async.status PENDING: print(任务等待中被执行)elif async.status RETRY: print(任务异常后正在重试)elif async.status STARTED: print(任务已经开始被执行)十、django中使用(更新轮播图案例)最终达到的效果根据定时任务来更新redis中的缓存。用户获取资源都是从redis缓存中获取。避免了数据库的压力redis的配置dev.py# 缓存redis数据库配置CACHES {default: {BACKEND: django_redis.cache.RedisCache,LOCATION: redis://127.0.0.1:6379/10,OPTIONS: {CLIENT_CLASS: django_redis.client.DefaultClient,CONNECTION_POOL_KWARGS: {max_connections: 100}, # 同时的并发量DECODE_RESPONSES: True,PASSWORD: 123, } }}接口缓存1)什么是接口的后台缓存 前台访问后台接口后台会优先从缓存(内存)中查找接口数据 如果有数据直接对前台响应缓存数据 如果没有数据与(mysql)数据库交互得到数据对前台响应同时将数据进行缓存以备下次使用 了解前台缓存 - 前台在请求到接口数据后在前台建立缓存再发送同样请求时发现前台缓存有数据就不再对后台做请求了2)什么的接口会进行接口缓存 i)接口会被大量访问比如主页中的接口几乎所有人都会访问而且会重复访问 ii)在一定时间内数据不会变化(或数据不变化)的接口 iii)接口数据的时效性不是特别强(数据库数据发生变化了不是立即同步给前台验后时间同步给前台也没事) 注理论上所有接口都可以建立缓存只要数据库与缓存数据同步及时3)如何实现接口缓存主页轮播图接口views.pyfrom rest_framework.viewsets import ModelViewSetfrom rest_framework import mixinsfrom . import models, serializersfrom django.conf import settingsfrom rest_framework.response import Responsefrom django.core.cache import cacheclass BannerViewSet(ModelViewSet, mixins.ListModelMixin): queryset models.Banner.objects.filter(is_deleteFalse, is_showTrue).order_by(-orders)[:settings.BANNER_COUNT] serializer_class serializers.BannerSerializer# 有缓存走缓存没有缓存走数据库然后同步给缓存。接口自己实现def list(self, request, *args, **kwargs): banner_list cache.get(banner_list)if not banner_list: print(走了数据库) response self.list(request, *args, **kwargs) banner_list response.data cache.set(banner_list, banner_list, 86400) # 存进缓存中缓存配置了redis数据库return Response(banner_list)启动服务1):先切换到celery_task所在的同级目录(一般为根目录下)2):开一个终端(启动服务) celery worker -A celery_task -l info -P eventlet3):再开一个终端(添加任务): celery beat -A celery_task -l info# 注)-A 表示相对路径所以一定先进入celery_task所在包 -l 表示打印到日志 info 级别celery.pycelery框架django项目工作流程1)加载django配置环境2)创建Celery框架对象app配置broker和backend得到的app就是worker3)给worker对应的app添加可处理的任务函数用include配置给worker的app4)完成提供的任务的定时配置app.conf.beat_schedule5)启动celery服务运行worker执行任务6)启动beat服务运行beat添加任务重点由于采用了django的反射机制使用celery.py所在的celery_task包必须放置项目的根目录下# 一、加载django配置环境import osos.environ.setdefault(DJANGO_SETTINGS_MODULE, luffyapi.settings.dev)# 二、加载celery配置环境from celery import Celerybroker redis://:123127.0.0.1:6379/1backend redis://:123127.0.0.1:6379/2# workerapp Celery(brokerbroker, backendbackend, include[celery_task.tasks]) # 外面的包名和文件名一般都是固定# 时区app.conf.timezone Asia/Shanghai# 是否使用UTCapp.conf.enable_utc False# 任务的定时配置from datetime import timedeltafrom celery.schedules import crontabapp.conf.beat_schedule {# 定时任务名字update_banner_cache: {task: celery_task.tasks.update_banner_list,args: (),schedule: timedelta(seconds10), # 3秒一次# schedule: crontab(hour8, day_of_week1), # 每周一早八点# schedule: crontab(minute0, day_of_week1), # 每周一早八点 }}minute : 分钟hour 小时day_of_week 礼拜day_of_month:月month_of_year:年fall_task任务名自定义task:任务来源args:任务参数schedule定时时间(秒)tasks.pyfrom .celery import appfrom django.core.cache import cachefrom home import models, serializersfrom django.conf import settingsapp.taskdef update_banner_list(): queryset models.Banner.objects.filter(is_deleteFalse, is_showTrue).order_by(-orders)[:settings.BANNER_COUNT] banner_list serializers.BannerSerializer(queryset, manyTrue).data# 拿不到request对象所以头像的连接base_url要自己组装for banner in banner_list: banner[image] http://127.0.0.1:8000%s % banner[image] cache.set(banner_list, banner_list, 86400)return True选择了IT必定终身学习作者Jeff出处http://dwz.date/aNfM图片和内容源自网络分享若有侵权请联系删除上海艾磊科技有限公司专门为企业提供IT咨询IT外包系统集成以及各类IT增值服务。其中增值服务包括OFFICE 365云服务鼎捷企业ERP管理软件云备份企业邮箱无线覆盖上网行为管理VPN架设网络安全服务INTERNET接入设备租赁 IP电话服务