• 接口实现之后,需要异步跑自动化任务,因为自动化执行是耗时耗资源的操作,不可能在请求发出去后一直等待全部结果返回,所以需要实现异步。

  • 环境:

    Python3.6 , PyCharm, W7

  • Celery介绍:

    pip install celery
    pip install djcelery

  • Celery DOC

  • Celery是一个简单、灵活可靠的,处理大量消息的分布式系统,它是一个专注于实时处理的任务队列, 同时也支持任务调度。

  • Celery中有两个比较关键的概念

    Worker: worker 是一个独立的进程,它持续监视队列中是否有需要处理的任务;

    Broker: broker 也被称为中间人或者协调者,broker 负责协调客户端和 worker 的沟通。客户端向 队列添加消息,broker 负责把消息派发给 worker。

  • 项目结构:
    这里写图片描述

  • 实现:

    • 编写代码:

      1. 修改项目setting.py配置

        
        # celery 配置
        djcelery.setup_loader()
        BROKER_URL = 'django://'  # 使用django做broker
        CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'  # 定时任务.
        CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'  # 需要跟踪任务的状态时保存结果和状态
        CELERY_ENABLE_UTC = False  # 不用UTC.
        CELERY_TIMEZONE = 'Asia/Shanghai'  # 指定上海时区
        CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']  # 允许的格式
        CELERY_TASK_SERIALIZER = 'json'
        CELERY_RESULT_SERIALIZER = 'json'
        CELERY_IGNORE_RESULT = True
        INSTALLED_APPS = [
            'djcelery',# 新增
            'kombu.transport.django',  # 新增kombu.transport.django则是基于Django的broker
        
      2. 在项目下新建celery.py 如上图

        from __future__ import absolute_import, unicode_literals
        import os
        from celery import Celery
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AutoApi.settings')
        app = Celery('AutoApi')
        app.config_from_object('django.conf:settings')
        app.autodiscover_tasks()
        
      3. 在应用下新建tasks.py 如上图

        @shared_task
        def running(env, project, cases):
        print('开始执行异步任务') 
        print(env,project,cases)
        # test_cases_runing(env, project, cases) 启动自动化测试
        return 1
      4. 创建Celery所需的数据表

        python manage.py migrate

      5. 启动Django服务

        python manage.py runserver 0.0.0.0:8090

      6. 启动celery worker 服务

        celery -A AutoApi worker -l info

      7. celer worker 启动成功提示

        提示 [2017-11-03 20:30:17,526: WARNING/MainProcess] celery@SHANB040312 ready.
        代码celery worker 服务启成功了

      8. postman 请求如下图,可以看到响应的时间是毫秒
        这里写图片描述

      9. 看下console celery worker 的输出,可以看到成功执行了我们的异步任务

        [2017-11-03 20:39:25,234: INFO/MainProcess] Received task: Api.tasks.running[8a994909-a139-4f2a-bcdd-58b6280a2bc3]
        [2017-11-03 20:39:31,740: WARNING/Worker-1] 开始执行异步任务
        [2017-11-03 20:39:31,740: WARNING/Worker-1] sit
        [2017-11-03 20:39:31,741: WARNING/Worker-1] zhengxin
        [2017-11-03 20:39:31,741: WARNING/Worker-1] test_taiyue.py
        [2017-11-03 20:39:31,742: INFO/MainProcess] Task Api.tasks.running[8a994909-a139-4f2a-bcdd-58b6280a2bc3] succeeded in 0s: 1

        其中有很多细节可以优化

        • broker 可以使用RabbitMQ 和 Redis
        • worker 可以再多启几个进程, 可以使用
        • 可以启用 Celery Flower 它是一个 celery 的监控工具,它提供了一个图形用户界面,可以极大的方便我们监控任务的执行过程, 执行细节及历史记录,还提供了统计功能。

        原理(网络资源):

        celery的模块架构

        以上就是我们的异步任务的实现,后面有机会再总结下定时任务的实现和使用RabbitMQ 。

        接着上一篇Python Django 实现restful API ,本次目的是为了实现异步任务先从需求说起接口实现之后,需要异步跑自动化任务,因为自动化执行是耗时耗资源的操作,不可能在请求发出去后一直等待全部结果返回,所以需要实现异步。环境: Python3.6 , PyCharm, W7Celery介绍:安装: pip install celery
        Python ——Tornado框架(一) 参考博文:https://www.cnblogs.com/wupeiqi/articles/5341480.html 这个Tornado框架,与 Django 框架有什么区别呢? Tornado连数据库的ORM操作都没有,需要自己到数据库写语句。相对于 Django ,Tornado的组件特别少。在Tornado里,主要是用的还是CBV的方式。Tornado有自己的模板引擎渲染方式。 Tornado没有form验证,没有session。所以需要自己写,自己开发组件。 2. 在 Django 视图中发出非阻塞HTTP请求。 3. 使用 Django 异步 视图简化基本的后台 任务 。 4. 使用sync_to_async在 异步 视图中进行同步调用。 5. 说明何时应该使用或不应该使用 异步 视图。 6. 如果在 异步 视图中调用同步 任务 怎么办? 7. 如果在 异步 视图中进行同步 任务 异步 任务 调用怎么办? 8. 既然 Django 已经支持 异步 视图了,那么 Celery 还有用吗?
        Tornado应该运行在类Unix平台,为了达到最佳的性能和扩展性,仅推荐Linux和BSD(充分利用Linux的epoll工具和BSD的kqueue达到高性能处理的目的)db.py main.py......
        ### 回答1: Django Celery 是一个用于 Django 项目的分布式 任务 队列,可以用来处理 异步 任务 和定时 任务 。其中,定时 任务 可以通过 Celery Beat 来 实现 ,它可以根据配置的时间间隔或者时间点来执行 任务 Celery Beat 可以与 Celery Worker 配合使用, 实现 任务 异步 执行。通过 Django Celery Celery Beat,我们可以方便地 实现 定时 任务 ,提高应用的性能和可靠性。 ### 回答2: Django celery 是一个 Python 应用程序框架,专门用于在后台运行分布式 任务 ,有时也被称为分布式队列。在应用程序中,定时 任务 是一个非常常见的 任务 Django celery 提供了一个强大的定时 任务 管理系统来解决这个问题。 Django celery 的定时 任务 是基于定时器和消息中间件构建的。它使用 Celery Beat作为作业调度程序,并配合 Redis/RabbitMQ 等中间件 实现 消息队列。 Django celery 的主要优点是:它是一个分布式的后台 任务 队列处理工具,可以把 任务 异步 化,这样可以避免等待的时间,提高后台处理效率。 Django celery 提供了一个 Celery Beat 守护进程来提供定时 任务 的功能。它可以通过两种方式执行定时 任务 : 1. 周期性 任务 :这些 任务 在固定的时间间隔内按照预定义的计划运行。例如,我们可以计划在每小时的第15分运行一次 任务 ,或在每天的某个时候运行一次 任务 。这些计划由 Celery Beat 系统维护并执行。我们可以通过在 Django 管理后台中录入 任务 来定义这些计划。 2. 延迟 任务 :这些 任务 在使用调度程序时不需要预定义计划。而是只需在需要执行 任务 时向 Celery 队列添加 任务 即可。这些 任务 可以通过一个延迟的 任务 调用来执行。例如,我们可以定义一个在应用程序中上传文件后执行的 任务 ,或在发送电子邮件后执行一个 任务 Django celery 中定义的 任务 需要满足特定的格式,通常是一个 Python 函数,它可以接收任意数量的参数,这些参数可以是 Python 任何数据类型。独立的 Django celery 任务 不需要与应用程序的其他部分通信,因此它们比定期执行的 任务 简单得多。要执行此 任务 ,请将其添加到 Celery 消息队列中即可。 总之,采用 Django celery 可以轻松地 实现 定时 任务 ,极大地提高系统的性能和效率。无论是周期性 任务 还是延迟 任务 ,您都可以使用 Django celery 来轻松定义和调度它们。无论您是在创建 Web 应用程序、处理大量数据或执行任何其他 任务 Django celery 都是一个非常有用的工具。 ### 回答3: Django celery 是一款流行的 任务 队列库,它提供的定时 任务 功能可以让你在特定的时间间隔内自动执行代码。这对于需要重复执行某些操作的应用程序来说非常有用。 要使用 Django celery 完成定时 任务 ,需要按照以下步骤进行操作: 1. 安装 Django celery :可以通过 pip 命令来安装,具体命令如下: pip install django - celery 2. 创建 celery 实例:在 Django 项目的根目录下,创建一个名为 celery .py 的文件,并在其中实例化 celery 应用程序,代码如下: ``` python from __future__ import absolute_import, unicode_literals import os from celery import Celery # 设置默认 DJANGO _SETTINGS_MODULE os.environ.setdefault(' DJANGO _SETTINGS_MODULE', 'yourapp.settings') app = Celery ('yourapp') # 使用同一个文件配置 celery django 环境 app.config_from_object(' django .conf:settings', namespace=' CELERY ') # 从所有已注册的app中加载 任务 模块 app.autodiscover_tasks() 3. 创建定时 任务 :在 Django 项目的某个应用下,创建一个名为 tasks.py 的文件,并在其中定义需要执行的 任务 ,例如: ``` python from celery .decorators import periodic_task from celery .task.schedules import crontab @periodic_task(run_every=(crontab(minute='*/15'))) def my_task(): # 每15分钟执行一次的 任务 print("Task executed at " + datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 4. 启动 worker 和 beat:在命令行中分别运行以下命令,分别启动 worker 和 beat: $ celery -A yourapp worker -l info $ celery -A yourapp beat -l info 5. 设置定时 任务 并运行:现在,你可以通过 Django celery 提供的定时 任务 管理界面来设置定时 任务 ,也可以在代码中自定义 任务 的时间间隔,然后启动 任务 运行。 总的来说, Django celery 提供的定时 任务 功能可以使你的应用在特定的时间间隔内自动执行代码,从而提高应用的效率和可靠性。需要注意的是,在设计和 实现 定时 任务 时,应尽量考虑到并发性和数据一致性等实际问题,以确保 任务 运行的正确性和稳定性。
  •