一、关于celery

芹菜celery是一个python实现的异步任务队列,可以用于爬虫、web后台查询、计算等等。通过任务队列,当一个任务来临时不再傻傻等待。

他的架构如下:

  • Broker

我们的生产者创建任务后会进入celery的任务调度队列中间件Broker,Broker通过调度规则将消息(任务)调度消息队列,Broker依赖第三方队列消息代理如rabbitmqredis等。

  • Worker

广大劳动者,盯着消息队列,当队列中有消息时把它拿过来给处理了。

  • Backend

用于结果存储经worker处理的结果,比如常用的数据库等。


使用celery

在本文中咱们使用rabbitmq(celery推荐)作为消息代理中间件。

我们创建的celery目录如下

  1. learn_celery/
  2. ...celery_env/
  3. ...celery.py
  4. ...my_task1.py
  5. ...my_task2.py
  6. ...task1_run.py
  7. ...task2_run.py
1. 创建虚拟环境并安装celery、flower(web监控),这里不做赘述。
2.安装咱们的消息队列中间件rabbitmq

这里以docker的方式运行并配置,指定主机名为rabbit(rabbitmq是以主机名来访问的,所以这是必须的),容器名称为celery_rabbitmq

  1. docker run -d -p 5672:5672 -h rabbit --name celery_rabbitmq rabbitmq

添加用于celery访问的用户,以及配置configurewriteread权限,在下面我们配置rabbit_user拥有所有配置、写入和读取权限。

  1. docker exec -it celery_rabbitmq rabbitmqctl add_user rabbit_user rabbit_pass
  2. docker exec -it celery_rabbitmq rabbitmqctl add_vhost rabbit_vhost
  3. docker exec -it celery_rabbitmq rabbitmqctl set_user_tags rabbit_user celery
  4. docker exec -it celery_rabbitmq rabbitmqctl set_permissions -p rabbit_vhost rabbit_user ".*" ".*" ".*"
3.创建celery应用
  1. #celery.py
  2. from celery import Celery
  3. broker_rabbitmq="amqp://rabbit_user:rabbit_pass@i-k9pwet2d/rabbit_vhost"
  4. app=Celery("learn_celery",broker=broker_rabbitmq,backend="rpc://",include=["learn_celery.my_task2","learn_celery.my_task2"])

我们通过创建app来实例化Celery,项目包的名称为learn_celery,通过broker_rabbitmq来连接rabbitmq,rabbitmq的amqp协议格式为

  1. amqp://userid:password@hostname:port/virtual_host

由于我们是在docker中启动的rabbitmq,所以我们的hostname应该为宿主机的hostname。

指定后端通过rpc回传数据,include加载带worker处理的任务learn_celery.my_task1learn_celery.my_task2

4.创建两个任务(消息)
  1. #my_task1.py
  2. from .celery import app
  3. import time
  4. @app.task
  5. def args_add1(x,y):
  6. print("start task no.1 now!")
  7. time.sleep(10)
  8. print("task no.1 end!")
  9. return x+y
  10. #my_task12.py
  11. from .celery import app
  12. import time
  13. @app.task
  14. def args_add2(x,y):
  15. print("start task no.2 now!")
  16. time.sleep(20)
  17. print("task no.2 end!")
  18. return x+y

在这里我们导入了celery中的app,并用它来装饰我们的方法args_add,在args_add中模拟任务处理时间分别为10s、20s然后返回结果。

5.发送任务给celery
  1. #tasks1_run.py
  2. from .my_task1 import args_add1
  3. import time
  4. reslut=args_add1.delay(11,22)
  5. print("task over?{}".format(reslut.ready()))
  6. print("task reslut:{}".format(reslut.result))
  7. time.sleep(15)
  8. print("task over?{}".format(reslut.ready()))
  9. print("task reslut:{}".format(reslut.result))
  10. #tasks2_run.py
  11. from .my_task2 import args_add2
  12. import time
  13. reslut=args_add2.delay(33,44)
  14. print("task over?{}".format(reslut.ready()))
  15. print("task reslut:{}".format(reslut.result))
  16. time.sleep(25)
  17. print("task over?{}".format(reslut.ready()))
  18. print("task reslut:{}".format(reslut.result))

关于任务的delay,官方文档(参考)是这样描述的,我把它理解为发送任务给celery或者celery调用待进来的任务。

reslut.ready() 返回任务执行是否执行完成True or False

reslut.result 返回任务执行结果

我们在任务进入celery和结束分别检查一次。


二、看看结果

1.启动worker

进入learn_celery的父目录。启动learn_celery的这个应用worker,并指定并发数为10个

  1. celery -A learn_celery worker --loglevel=info --concurrency=10

若celery连接rabbitmq正常,我们可以看到如下的info

2.执行任务

为了便于观察,我们另外开启一个窗口2,到learn_celery父目录运行task1_run模块

  1. python -m learn_celery.tasks1_run

开启窗口3,到learn_celery父目录运行task2_run模块

  1. python -m learn_celery.tasks2_run

可以看到经过各自任务的等待时间后,两个任务都顺利执行结束,并得到结果,接下来我们到worker上看一下info

由于celery的并发性,收到任务马上被调入执行,任务1耗时10s结果为33,任务2耗时20s结果为77


三、使用Flower监控celery

1.启动flower
  1. celery -A learn_celery flower
2. 查看web监控 http://ip:5555

Tasks中可以查看到当前任务队列的状态、参数、接收和启动、执行时间。



Dashborad中查看当前worker节点的相关信息


文章有不足的地方欢迎指出。

欢迎收藏、点赞、提问。关注顶级饮水机管理员,除了管烧热水,有时还做点别的。


NEXT

  • celery的深入了解

  • celery在django中的使用

Python中任务队列-芹菜celery的使用的更多相关文章

  1. Python中Celery 的基本用法以及Django 结合 Celery 的使用和实时监控进程

    celery是什么 1 celery是一个简单,灵活且可靠的,处理大量消息的分布式系统 2 专注于实时处理的异步任务队列 3 同时也支持任务调度 执行流程 Celery 基本使用 tasks.py i ...

  2. python中利用redis构建任务队列(queue)

    Python中的使用标准queue模块就可以建立多进程使用的队列,但是使用redis和redis-queue(rq)模块使这一操作更加简单. Part 1. 比如首先我们使用队列来简单的储存数据:我们 ...

  3. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  4. 【转】Python 并行分布式框架 Celery

    原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...

  5. python中的轻量级定时任务调度库:schedule

    提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中.不过,一个小的定时脚本,要用celery的话太“重”了.所以,我找到了一个轻量级的定时任务调度的库:sch ...

  6. 11: python中的轻量级定时任务调度库:schedule

    1.1 schedule 基本使用 1.schedule 介绍 1. 提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中. 2. 不过,一个小的定时脚本,要用 ...

  7. Python定时任务-schedule vs. Celery vs. APScheduler

    在Python开发过程中我们经常需要执行定时任务,而此类任务我们通常有如下选项: 自己造轮子 使用schedule库 使用Celery定时任务 使用APScheduler 自己造轮子实现,最大的优势就 ...

  8. 任务队列 与 Celery概述

    一.任务队列(Task Queues) 1.1 什么是任务队列? 任务队列用于管理后台工作,通常这些后台工作必须在 HTTP请求-响应循环 之外执行. 1.2 为什么需要任务队列? 对于那些不是由客户 ...

  9. Python中实现异步并发查询数据库

    这周又填了一个以前挖下的坑. 这个博客系统使用Psycopy库实现与PostgreSQL数据库的通信.前期,只是泛泛地了解了一下SQL语言,然后就胡乱拼凑出这么一个简易博客系统. 10月份找到工作以后 ...

随机推荐

  1. Qt - QLineEdit编辑框

    QLineEdit输入内容获取及合理性检查? 控件自带触发信息: void textChanged(const QString &);void textEdited(const QString ...

  2. (代替人类)很多操作都在Settings里面。 5.安装第三方库

    2020-02-01 pycharm 使用教程 LingSmart关注 0.0842020.02.07 15:08:50字数 1,394阅读 680 实在无聊,就来学习吧.学习pycharm的使用教程 ...

  3. 强哥JavaScript学习笔记

    js文件放header头最后,js代码放body体最后 js语言定位: js是基于对象的语言 php.java是面向对象的语言 定义变量: var str="hello world" ...

  4. 联想 lenove 3750 M4服务器更改启动项和管理口IP

    联想 lenove 3750 M4服务器更改启动项和管理口IP 注: 因为在机房拍照的原因,再加上工作比较忙:整理成文档的时候有的过程已经忘记了,所以有的步骤可能会缺失,里面的选项都已经用中文方式表达 ...

  5. 分布式存储ceph---ceph常用命令(3)

    1.查看ceph集群配置信息 ceph daemon /var/run/ceph/ceph-mon.$(hostname -s).asok config show 2.在部署节点修改了ceph.con ...

  6. 第9章 case条件语句的应用实践

    case语句企业级生产案例 范例9-7:实现通过传参的方式往/etc/openvpn_authfile.conf里添加用户,具体要求如下. 1)命令用法为: USAGE: sh adduser {-a ...

  7. android Room数据库仓库模式

  8. CRC校验原理简介及C代码实现说明

    1 原理 参考文档:CRC校验 (qq.com) 参考书籍:<计算机网络(第7版)-谢希仁> 1.1 原理简介 CRC是一种检错方法. 在发送端,先把数据划分为组,假定每组k个比特.现假定 ...

  9. GO学习-(23) Go语言操作MySQL + 强大的sqlx

    Go语言操作MySQL MySQL是业界常用的关系型数据库,本文介绍了Go语言如何操作MySQL数据库. Go操作MySQL 连接 Go语言中的database/sql包提供了保证SQL或类SQL数据 ...

  10. npm基本用法及原理(10000+)

       作为前端开发者,应该每个人都用过npm,那么npm到底是什么东西呢?npm run,npm install的时候发生了哪些事情呢?下面做详细说明. 1.npm是什么 npm是JavaScript ...