celery

celery的使用以及在Django中的配置,不详细介绍,主要记录在Django中使用的坑点。

坑点

时区问题

celery默认的时区是世界标准时间,比东八区慢了8个小时,如果发布定时任务,一定要注意定时的时间,否则可能用了正确的方法,但是并没有调用成功

设置celery的时区可以在Django项目的settings.py中添加一条设置

CELERY_TIMEZONE = 'Asia/Shanghai'

django-celery可以识别在设置中的时区

也可以在发布定时任务的时候,指定到当前的时区,使用Django自带的get_current_timezone()

# 将需要设定的时间转换成当前时区的时间
from django.utils.timezone import get_current_timezone
import datetime send_time = datetime.datetime.now() + datetime.timedelta(days=1)
tz = get_current_timezone()
send_time = tz.localize(send_time)

在使用异步任务的时候将转换后的时间传入到参数里面

celery_task.apply_async(args=[], kwdg={}, eta=send_time)

当然,你也可以使用间隔时间执行异步任务,对应apply_async()里面的countdown参数

celery_task.apply_async(countdown=seconds)

celery的序列化问题

celery提供了两个序列化的格式,picklejson,pickle是python一个序列化的库,可以实现多种格式数据的序列和反序列化,对应pickle和unpickle

设置中可以指定celery接受的数据格式,以及任务和结果的序列化器

# settings.py
# celery允许接收的数据格式,可以是一个字符串,比如'json'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
# 异步任务的序列化器,也可以是json
CELERY_TASK_SERIALIZER = 'pickle'
# 任务结果的数据格式,也可以是json
CELERY_RESULT_SERIALIZER = 'pickle'

在Django中的使用尤其需要注意,如果你需要向异步任务传入一个queryset,需要将接收的格式和序列化器设置为'pickle',即如上设置

不建议将ORM对象传给celery的异步任务,拿到的可能是过期数据,建议传递id

结果

如果不需要讲异步任务执行的结果进行处理,即异步任务的执行结果和业务逻辑关系不大,建议不存储celery异步任务的结果。

如果保留结果,celery将会为任务结果建立一个队列,并且一直等到异步任务给出结果才会将任务从队列中删除,创建和管理任务的开销很大,可以在这篇博客中看到:https://www.cnblogs.com/blaketairan/p/7136897.html

在Django的settings中设置忽略celery任务执行结果

CELERY_IGNORE_RESULT = True

使用不同的queue

如果任务A比任务B更重要,而任务B的量非常大,重要的任务A就需要不断等待任务B完成后才能继续进行,这时候,可以使用不同的queue来保存任务,让不同的worker来执行两种任务

CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),
Queue('for_task_A', Exchange('for_task_A'), routing_key='for_task_A'),
Queue('for_task_B', Exchange('for_task_B'), routing_key='for_task_B'),

然后自定义router来执行不同的任务


CELERY_ROUTES = {
'my_taskA': {'queue': 'for_task_A', 'routing_key': 'for_task_A'},
'my_taskB': {'queue': 'for_task_B', 'routing_key': 'for_task_B'},
}

然后在启动celery时,指定不同的worker

celery worker -E -l INFO -n workerA -Q for_task_A celery worker -E -l INFO -n workerB -Q for_task_B

最新文章

  1. 如何搭建git服务器
  2. Eclipse代码和xml文件的智能提示
  3. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
  4. nginx实现本地图片生成缩略图
  5. poj3565Ants(KM-几何与图论的结合)
  6. C# TryXXXX模式
  7. 素数个数统计——Eratosthenes筛法 [LeetCode 204]
  8. hdu 5745 La Vie en rose DP + bitset优化
  9. android开发之路04(初级android工程师必会,你懂得!)
  10. Spark技术内幕:Client,Master和Worker 通信源码解析
  11. 监听iOS检测屏幕旋转状态,不需开启屏幕旋转-b
  12. 【Objective-C基础教程-读书笔记】第1章 启程
  13. struts2源码调试环境的搭建
  14. @Transactional 注解说明
  15. 清风注解-Swift程序设计语言:Point1~5
  16. 学习linux能有什么用
  17. python命令行参数解析模块argparse和docopt
  18. 利用css+原生js制作简易钟表
  19. Motrix for Mac(百度网盘加速/全能下载软件) v1.3.7最新版!
  20. Linux终端复用神器-Tmux使用梳理

热门文章

  1. 修改和编译spring源码,构建jar(spring-context-4.0.2.RELEASE)
  2. Linux 笔记 - 第十三章 Linux 系统日常管理之(三)Linux 系统日志和服务
  3. Webpack配置区分开发环境和生产环境
  4. Java异常详谈
  5. AJAX基础内容
  6. 用call或bind实现bind()
  7. C/C++中变量的作用域和存储类型简介
  8. 使用Java元注解和反射实现简单MVC框架
  9. 阿里云服务器ecs配置之安装redis服务
  10. jquery 动态控制显隐