zoukankan      html  css  js  c++  java
  • python_django_celery的初步使用

    celery学习:http://docs.jinkan.org/docs/celery/

    什么是celery?

    Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。它专注于实时处理的任务队列,同时也支持任务调度。

    什么地方可以用到celery?(基础的两个用处)

    1. 用户发起request,并且要等待response返回,但是在视图中有一些耗时的操作,导致用户可能会等待很长时间才能接受response,用户体验差,我们把耗时操作放在celery中执行,便可解决这个问题(处理耗时操作,因为celery 可异步分布式地异步处理任务)
    2. 网站每隔一段时间要同步一次数据,但http请求时是需要触发的,我们可以通过celery定时执行来解决这个问题(处理数据同步,因为celery可定时执行任务)

    安装celery:

    pip install celery
    pip install celery-with-redis   
    # 该命令会自动安装redis(python库操作redis的库)、celery、kombu、billiard、amqp、vine和celery-with-redis相关库 pip install django-celery

    celery操作名词:

    任务 (tssk) 本质是一个python函数,将耗时操作封装成了一个函数
    队列 (queque) 将要执行的任务放队列里
    工人(worker) 负责执行队列中的任务
    代理(broker) 负责调度,在部署环境中使用redis

    今天我们主要进行的是耗时操作的处理:

    在django中配置celery:

    1.在settings.py 文件的INSTALLED_APPS中添加 'djcelery' ,即INSTALLED_APPS=['djcelery',]

    2.在settings.py 文件最下方添加如下代码:

    # 配置celery
    import djcelery
    djcelery.setup_loader()  # 初始化队列
    # 中间人redis的端口号/数据库号
    BROKER_URL = 'redis://:redis密码@127.0.0.1:6379/0' # 0 : 表示使用的是redis第0个库
    # redis为中间人,若不设置中间人,会提示无法连接中间人的错误
    # 中间人:celery执行过程中的数据支持
    # celery 内容等消息的格式设置
    CELERY_ACCEPT_CONTENT = ['application/json',]
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    # selery 时区设置,使用settings中国TIME_ZONE同样的时区
    CELERY_TIMEZONE = TIME_ZONE
    CELERY_IMPORTS = ('myapp.task',)        # 用一个元组表示:myapp项目下的task.py文件
    # 在应用级myapp下创建task.py文件用于存放task任务函数

    3. 在应用级myapp 下创建task.py文件

     4. 迁移文件:

      生成celery需要的数据库表(直接迁移不用生成迁移文件:python manage.py migrate)

    5.创建celery.py文件

      在工程目录(项目级目录)下的mydiango下创建一个celery.py文件

      

     6.在celery.py文件copy如下内容进去(注:因为celery-with-django版本限制,安装的celery版本不同,这里配置的内容可能会不同):

    from django.conf import settings
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'whthas_home.settings')
    app = Celery('portal')
    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))
    配置文件

    7.在工程目录下的mydiango下的__init__.py(即创建celery.py的工程目录下)中配置如下内容:

    from .celery import app as celery_app

    celery处理耗时操作:

    首先,我们有一个耗时操作:

    利用time模块在返回页面前加上sleep模拟耗时操作(注:自行配制urls.py与html文件):

    # views.py
    #
    celery 耗时任务 import time def celery(request): time.sleep(5) # 延时5秒再执行后面的操作 return render(request,'myapp/celery.html')

    经验证页面需要5秒后才能返回!!

    耗时操作的处理:

    在进行上面的celery配置后!!

    1.将上面的耗时任务剪切到我们建立的task.py文件中,让其成为celery任务。

    2.在原有的方法上添加装饰器@task 或者@celery_app.task

    # task.py
    
    from celery import taskimport time
    
    @task           # @celery_app.task
    def text_celery():
        time.sleep(5)  # 延时5秒再执行后面的操作

    3.在原有的views.py文件中引用task.py 文件对应方法:

    from .task import test_celery
    
    def cite_celery(request):
        test_celery.delay()          # 耗时操作的处理
        return render(request,'myapp/celery.html')

    对应url

        path('celery/',views.cite_celery)

    注:在使用celery时,可能会出现kombu错误,可能的原因是版本不一致的情况,解决:

    https://blog.csdn.net/cn_1937/article/details/91992075

  • 相关阅读:
    Oracle 11g Release 1 (11.1) 单行函数——比较函数
    HTTP 协议演示——演示(55)
    Oracle 字符串分割函数 splitstr 和 splitstrbyseparators
    Bitmap 索引 vs. Btree 索引:如何选择以及何时使用?——15
    Oracle ——数据库 SQL 分页性能分析
    Oracle ——数据库 Hints
    Bitmap 索引 vs. Btree 索引:如何选择以及何时使用?——35
    Oracle 索引的数据结构
    Bitmap 索引 vs. Btree 索引:如何选择以及何时使用?——25
    回溯法>图的着色问题
  • 原文地址:https://www.cnblogs.com/Vera-y/p/11971252.html
Copyright © 2011-2022 走看看