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

浅谈celery的坑的更多相关文章

  1. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  2. Android安全开发之启动私有组件漏洞浅谈

    0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能 ...

  3. 浅谈html5 video 移动端填坑记

    这篇文章主要介绍了浅谈html5 video 移动端填坑记,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 本文介绍了html5 video 移动端填坑记,分享给大家,具体 ...

  4. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  5. 【转载】浅谈大规模k8s集群关于events的那些坑

    原文链接:一流铲屎官二流程序员[浅谈大规模k8s集群关于events的那些坑] 背景 随着k8s集群规模的增加,集群内的object数量也与日俱增,那么events的数量也会伴随其大量增加,那么当用户 ...

  6. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  7. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹——落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

  8. 浅谈对Spring Framework的认识

    Spring Framework,作为一个应用框架,官方的介绍如下: The Spring Framework provides a comprehensive programming and con ...

  9. javascript数组浅谈1

    最近心血来潮要开始玩博客了,刚好也在看数组这块内容,第一篇就只好拿数组开刀了,自己总结的,有什么不对的地方还请批评指正,还有什么没写到的方面也可以提出来我进行完善,谢谢~~ 首先,大概说说数组的基本用 ...

随机推荐

  1. Git学习-上传项目到github

    现在流行把项目代码上传到git上,今天试了好久,终于成功上传到git了,特做点笔记. 准备工作 在github上注册一个账号,创建一个仓库. 创建好仓库,得到它的地址: 开始上传 一.新建一个文件夹, ...

  2. Android数据列表展示之 RecylerView

    一.概述 1.RecyclerView是什么? RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.该控件用于在有限的窗口中展示大量数据集,它被作为ListVie ...

  3. hive 包含操作(left semi join)(left outer join = in)迪卡尔积

    目前hive不支持 in或not in 中包含查询子句的语法,所以只能通过left join实现. 假设有一个登陆表login(当天登陆记录,只有一个uid),和一个用户注册表regusers(当天注 ...

  4. SpringBoot 2.0 + Nacos + Sentinel 流控规则集中存储

    前言 Sentinel 原生版本的规则管理通过API 将规则推送至客户端并直接更新到内存中,并不能直接用于生产环境.不过官方也提供了一种 Push模式,扩展读数据源ReadableDataSource ...

  5. 39 (OC) 瀑布流、不规则UI

    39  (OC)  瀑布流.不规则UI

  6. java反射机制,以及对反射机制的了解

    反射是什么?反射有什么用?我相信大家在开始学的时候都会有疑惑,直到如今我学的还不够深入只能简单的说说反射的作用,理论的我也听得很迷糊,接下来我就以几个例子来 写写反射的用处: 494696003群,有 ...

  7. 【linux】【maven】maven及maven私服安装

    前言 系统环境:Centos7.jdk1.8 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的用户使用.当Maven需要下载构件的时候,它从私服请求,如 ...

  8. 暑期——第三周总结(Ubuntu系统安装eclipse问题【已解决】)

    所花时间:7天 代码行:200(python)+150(java) 博客量:1篇 了解到知识点 : 一: Python: 问题 unresolved reference xrange 解决方案 pyt ...

  9. SpringSecurity原理剖析与权限系统设计

    Spring Secutity和Apache Shiro是Java领域的两大主流开源安全框架,也是权限系统设计的主要技术选型.本文主要介绍Spring Secutity的实现原理,并基于Spring ...

  10. 死磕 java同步系列之Phaser源码解析

    问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这 ...