当有任务执行时间较长时一般会使用异步进程处理,返回给用户为执行中的操作,或者返回进度条。
当选择django作为web框架时,使用celery来进行异步管理是一个比较主流的方案,上一篇讲了使用celery进行定时任务的处理。
先做一个celery的基本配置,主要是指定中间件(这里选择redis),指定异步的线程数(决定了可同时处理任务的数量,由主机配置决定)
实现celery的异步配置也是比较简单,总的来说也分为三步。
第一步: 跟定时任务一样,给需要异步的函数加上celery装饰器,由celery接管函数
-
from celery import task
-
-
@task
-
def func(**kwargs):
-
pass
第二步: 实现调用逻辑,假设func函数在task文件下
-
tasks.func.apply_async((**kwargs),
-
retry=True,
-
retry_policy={
-
'max_retries': 3,
-
'interval_start': 1
-
})
当触发此调用函数时候就会触发异步,这里设置了如果调用失败的重调次数和间隔
第三步:启动django 和celery,跟定时任务中启动方式一样,只是少了beat
python manage.py runserver 0.0.0.0:8000
celery -A $appname worker -l info
当收到异步任务时候,前端会马上返回视图的返回结果,而celery中可以看到
-
[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) |