Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1649395
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 646
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-26 18:02
个人简介

祸兮福之所倚,福兮祸之所伏

文章分类

全部博文(63)

文章存档

2020年(11)

2019年(10)

2017年(10)

2016年(25)

2015年(7)

我的朋友

分类: Python/Ruby

2019-10-16 16:08:52

    当有任务执行时间较长时一般会使用异步进程处理,返回给用户为执行中的操作,或者返回进度条。
    当选择django作为web框架时,使用celery来进行异步管理是一个比较主流的方案,上一篇讲了使用celery进行定时任务的处理。
    先做一个celery的基本配置,主要是指定中间件(这里选择redis),指定异步的线程数(决定了可同时处理任务的数量,由主机配置决定)
    

实现celery的异步配置也是比较简单,总的来说也分为三步。
第一步: 跟定时任务一样,给需要异步的函数加上celery装饰器,由celery接管函数
    

点击(此处)折叠或打开

  1. from celery import task

  2. @task
  3. def func(**kwargs):
  4.    pass

第二步: 实现调用逻辑,假设func函数在task文件下

点击(此处)折叠或打开

  1. tasks.func.apply_async((**kwargs),
  2.     retry=True,
  3.     retry_policy={
  4.         'max_retries': 3,
  5.         'interval_start': 1
  6.     })
    当触发此调用函数时候就会触发异步,这里设置了如果调用失败的重调次数和间隔
 第三步:启动django 和celery,跟定时任务中启动方式一样,只是少了beat
    python manage.py runserver 0.0.0.0:8000
    celery -A $appname worker -l info

当收到异步任务时候,前端会马上返回视图的返回结果,而celery中可以看到
    

点击(此处)折叠或打开

  1. [2019-10-16 16:02:39,360: INFO/Main Process] Received task: api.tasks.save_height[76d00e72-c0a9-4618-8a99-50a5ed47ecdd]
    这种类似的日志,表示celery讲运行这个任务。

当celery运行完成时会生成处理结果,有时候需要及时向用户传递结果,或者运行的节点会定时向用户发送,这时候的逻辑就是服务器端主动向客户端发送信息,这时候就用到websocket了,后面会介绍如何在django中实现websocket的应用,以及在企业级应用中websocket的运行。



阅读(132005) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~