Python Django Celery 实现异步任务

接着上一篇Python Django 实现restful API ,本次目的是为了实现异步任务

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

  • 环境:

    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 。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 3.6.8中使用Celery实现异步类函数,您需要按照以下步骤进行设置: 1. 首先,确保已经安装了Celery和Redis(或其他消息代理)。 ``` pip install celery redis ``` 2. 创建一个Django项目,并在项目目录下创建一个名为`tasks.py`的文件。 3. 在`tasks.py`文件中,导入Celery并创建一个Celery实例。 ```python from celery import Celery app = Celery('your_project_name') ``` 4. 在Django项目的settings.py文件中添加Celery配置。 ```python CELERY_BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'redis://localhost:6379' ``` 这里使用了Redis作为消息代理和结果后端,您可以根据需要选择其他选项。 5. 在`tasks.py`文件中定义您的异步任务。 ```python @app.task def your_async_task(*args, **kwargs): # 执行异步任务的代码逻辑 pass ``` 6. 在您的异步类方法中使用`@app.task`装饰器。 ```python class YourAsyncClass: @app.task def async_method(self, *args, **kwargs): # 异步方法的代码逻辑 pass ``` 7. 在您的应用程序中,通过调用`your_async_task.delay()`或`YourAsyncClass().async_method.delay()`来调度异步任务。 ```python from your_project_name.tasks import your_async_task from your_app_name.your_module import YourAsyncClass # 调度异步任务 your_async_task.delay(*args, **kwargs) # 调度异步类方法 YourAsyncClass().async_method.delay(*args, **kwargs) ``` 8. 启动Celery工作进程。在终端中,导航到您的项目目录并运行以下命令: ``` celery -A your_project_name worker --loglevel=info ``` 这将启动一个Celery工作进程,准备接收和执行异步任务。 现在,当您调度异步任务时,它将在后台执行,而不会阻塞主线程。请确保您的Celery工作进程正在运行,并根据需要进行其他配置和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值