简介

celery 是一个简单、灵活、可靠的分布式系统,可以处理大量的消息。

celery 是一个任务队列,关注实时处理,同时支持任务调度。

它的工作机制是这样的:

快速使用

安装:pip3 install celery

# proj.py
from celery import Celery app = Celery("hello", broker="amqp://guest@localhost//") @app.task
def hello():
return "hello world"

启动 worker

// 启动 worker
$ celery -A proj worker -l info -------------- celery@bogon v4.2.2 (windowlicker)
---- **** -----
--- * *** * -- macOS-10.15.1-x86_64-i386-64bit 2019-12-09 17:10:39
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: hello:0x10b4bc640
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery # 标注 celery 获取的任务列表
[tasks]
. proj.hello [2019-12-09 17:10:39,731: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2019-12-09 17:10:39,750: INFO/MainProcess] mingle: searching for neighbors
[2019-12-09 17:10:40,788: INFO/MainProcess] mingle: all alone
[2019-12-09 17:10:40,802: INFO/MainProcess] celery@bogon ready.

任务派发

>>> from proj import hello
>>> hello.delay()
<AsyncResult: 5e9ad990-4d09-4ed3-9b90-a1ff00d9020f>

任务接收

[2019-12-09 17:12:06,720: INFO/MainProcess] Received task: proj.hello[5e9ad990-4d09-4ed3-9b90-a1ff00d9020f]
[2019-12-09 17:12:06,723: INFO/ForkPoolWorker-8] Task proj.hello[5e9ad990-4d09-4ed3-9b90-a1ff00d9020f] succeeded in 0.00046249000000386786s: 'hello world'

这样就成功使用了 celery

异步任务&定时任务

异步任务

在一些场景中,可能会涉及到发短信、邮件和一些比较耗时的任务,我们期望用户在使用的时候没有延时的效果,我们可以这样做.

A:先增加一个发送邮件的任务

@app.task
def send_mail():
# 伪造:发送邮件
time.sleep(3) # 模拟耗时
print("Hello:xxxxx")
return 1

B:任务派发

>>> from proj import send_mail
>>> res = send_mail.delay() # 这一步不用等待,即可执行以下代码
# 查看任务状态
>>> res.status
'PENDING' # 表示任务尚未执行完成
>>> res.status
'SUCCESS' # 任务执行成功
>>> res.result # 获取任务结果,也是 return 的值
1

C:任务查看

# 接收任务
[2019-12-09 17:36:41,369: INFO/MainProcess] Received task: proj.send_mail[cb6907f1-c65a-42af-a01e-0bd7af51140f]
[2019-12-09 17:36:44,372: WARNING/ForkPoolWorker-8] Hello:xxxxx
# 执行共耗时时间及结果值
[2019-12-09 17:36:44,391: INFO/ForkPoolWorker-8] Task proj.send_mail[cb6907f1-c65a-42af-a01e-0bd7af51140f] succeeded in 3.0201863589999967s: 1

如果获取任务状态及结果报错,需要配置 celery 实例的 backend 属性,来完成任务结果的存储

定时任务

在一些场景中,比如可能需要给用户来一份生日关怀、每天发一封给自己发一封天气预报...我们可以这样做.

  • 在添加定时任务的时候,需要使用到 celery beat 这样的一个调度器,由它来定期启动任务,派发给工作者去执行这些任务。
  • 默认情况下,任务来自 beat_schedule 设置,但是也可以使用自定义存储,比如将任务存储在SQL数据库中。
  • 要确保 celery beat 这个调度器只运行这一个,否则你可能会得到重复的任务。
  • Using a centralized approach means the schedule doesn’t have to be synchronized, and the service can operate without using locks.

A:配置一个发生日关怀的任务

@app.task
def send_birthday_wish(name):
# 伪造:发送生日祝福
print(f"{name}, Happy birthday to you ~ ")
return 1

B:配置何时执行

因处于东8区,先改下时区的配置

app.conf.timezone = "Asia/Shanghai"

配置任务

# 第一种配置方式
...
from celery.schedules import crontab ...
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
# 每 10s 发送一个生日祝福
sender.add_periodic_task(10.0, send_birthday_wish.s('liuzhichao'), name='add every 10') # 每 30s 发送一个生日祝福
sender.add_periodic_task(30.0, send_birthday_wish.s('jenny'), expires=10) # 每周一 7:30 发送一个生日祝福
sender.add_periodic_task(
crontab(hour=7, minute=30, day_of_week=1),
send_birthday_wish.s('xx'),
) # 第二种配置方式
app.conf.beat_schedule = {
# 每 30s 发送一次生日祝福
'add-every-30-seconds': {
'task': 'proj.send_birthday_wish',
'schedule': 10.0,
'args': ('liuzhichao', )
},
# 每年 7月17号 9点30分 发送生日祝福
'add-every-year': {
'task': 'proj.send_birthday_wish',
'schedule': crontab(
minute=30, hour=9, day_of_month=17, month_of_year=7
),
'args': ('liuzhichao', )
}
}

C:启动定时任务

# 启动定时任务服务
$ celery -A proj beat
OR
# 可以通过激活 workers -B 选项将 beat 嵌入到 worker 中,如果你永远不会运行一个以上的 worker 节点,这是很方便的,但是它不常用,因此不推荐在生产中使用。
$ celery -A proj worker -B

更多的属性(HIGH API)

eta & countdown & expires

retry & ignore_result

组操作

更多参考

请点击这里

任务派发的三种方式

框架集成

django及定时任务的配置

其它框架集成

高可用

celery 进程挂掉

用正确的姿势使用 celery的更多相关文章

  1. xpath轴的正确使用姿势

    网上看了许多关于轴的介绍,只介绍了语法,而没有明说具体实际中该怎么使用,百思不得其解. 背景--python中使用xpath:  ----------------------------------- ...

  2. 高版本jquery尤其是1.10.2的版本设置input radio设置值的最正确的姿势。

    $("input:radio[name="analyshowtype"]").attr("checked",false); $(" ...

  3. NSnotificationCenter 正确使用姿势, removeObject 探索

    最近在做平板的过程中,发现了一些很不规范的代码.偶然修复支付bug的时候,看到其他项目代码,使用通知的地方没有移除,我以为我这个模块的支付闪退是因为他通知没有移除的缘故.而在debug和看了具体的代码 ...

  4. 微信H5中静默登录及非静默登录的正确使用姿势

    在微信中打开网页且需要调用微信登录接口时,微信官方给我们提供了两种登录调用方式:静默登录和非静默登录:但是官方文档中却没有说明在何种情况下使用静默登录,何种情况下使用非静默登录,所以在这里,我想将之前 ...

  5. Java日志正确使用姿势

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中“尽情”的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的bug发生,作为一名 ...

  6. MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集

    MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...

  7. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  8. 玩转java多线程(wait和notifyAll的正确使用姿势)

    转载请标明博客的地址 本人博客和github账号,如果对你有帮助请在本人github项目AioSocket上点个star,激励作者对社区贡献 个人博客:https://www.cnblogs.com/ ...

  9. Gradle的依赖方式——Lombok在Gradle中的正确配置姿势

    写过java的都知道,lombok几乎在项目中处于不可或缺的一部分,但是lombok在Gradle的项目中配置并非人人都知道. 很多人在项目依赖中直接这样写 1 compile "org.p ...

随机推荐

  1. 《CI/CD 流程以及原理说明》

    自动化部署 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法.CI/CD 的核心概念是持续集成.持续交付和持续部署.作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在 ...

  2. 关于Mysql datetime类型存储范围测试

    创建一个datetime表 > create table date_time(time datetime); > desc date_time; +-------+----------+- ...

  3. Spring Boot 框架下使用MyBatis访问数据库之基于XML配置的方式

    MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML ...

  4. ElasticSearch 中文分词搜索环境搭建

    ElasticSearch 是强大的搜索工具,并且是ELK套件的重要组成部分 好记性不如乱笔头,这次是在windows环境下搭建es中文分词搜索测试环境,步骤如下 1.安装jdk1.8,配置好环境变量 ...

  5. 92.vue---新手从本地项目开发到服务器线上运行爬坑。

    因为我做的是后台,所以不用做SEO 参考 本项目的定位是后台集成方案,不太适合当基础模板来进行二次开发.因为本项目集成了很多你可能用不到的功能,会造成不少的代码冗余.如果你的项目不关注这方面的问题,也 ...

  6. vue.js 如何加载本地json文件

    在项目开发的过程中,因为无法和后台的数据做交互,所以我们可以自建一个假数据文件(如data.json)到项目文件夹中,这样我们就可以模仿后台的数据进行开发.但是,如何在一个vue.js 项目中引入本地 ...

  7. 自动化测试模型 Selenium IDE Selenium Gird2

    1.线性测试 每个测试脚本相对独立,且不产生其他依赖与调用,其实就是单纯的来模拟用户完整的 操作场景.前一篇所写的测试脚本就属于线性测试. 优点:每个脚本完整且独立 缺点:测试用例的开发与维护成本高 ...

  8. NN入门

    参考资料:https://blog.csdn.net/kwame211/article/details/77337166, 仅作为个人学习笔记.人工智能的底层模型是"神经网络"(n ...

  9. docker命令小全 this is my note.

    服务器类型:linux =>centos 7.X以上版本 常用命令使用紫色加粗标明 1.安装yum-util(为配置docker安装时使用阿里镜像做准备):yum install -y yum- ...

  10. win10和linux引导问题(没有系统选择界面)

    由于最近学习嵌入式和c模块化编程,需要使用Linux系统,但是编程之外,WIN10还是主力系统,决定装双系统. 往常一样,百度装双系统方法,网上千篇一律,大都一个套路. 首先,WIN10 下,新开一个 ...