Python celery 学习笔记

概述

   celery是一个python实现的分布式任务执行框架,本文为学习笔记:

  • python 3.8.6
  • celery 5.1.2
  • 操作系统 win10
  • redis 3.0.504

安装

  • pip install celery
  • pip install flower (任务监控平台)
  • pip install eventlet (win10 环境需要)

官方文档地址
参考的文章
框架架构流程图:

image.png

参考官网上面的例子,将celery 当成一个独立工程来维护,方便将已有的业务按统一规范写成任务入口函数
目录结构如下:
image.png

celery.py 文件代码:

from celery import Celery

app = Celery('proj',
             broker='redis://:123456@10.2.13.167:6379/1',
             backend='redis://:123456@10.2.13.167:6379/2',
             include=['proj.tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
    result_expires=3600,
)

if __name__ == '__main__':
    app.start()

tasks.py 文件代码如下:

from .celery import app


@app.task
def add(x, y):
    print("call add")
    return x + y


@app.task
def mul(x, y):
    return x * y


@app.task
def xsum(numbers):
    return sum(numbers)

启动服务

  • 启动 celery celery -A proj worker -l INFO -P eventlet
  • 启动 flower celery -A proj flower --address=127.0.0.1 --port=5566 # web监控页面打开方式 http://127.0.0.1:5566
    直接ctrl+c 退出程序
    在liunx上面 支持以 守护进程方式启动 celery multi start w1 -A proj -l INFO multi 其它参数:重启是 restart 停止是stop,还支持启动多个worker 这里是只启动了一个,具体参数参考官方文档

集成到flask框架中

   celery集成到flask框架中不需要安装任何扩展,网上有其它的方式进行集成,本人采用的是,直接调用 tasks.py 下面的任务函数的方式实现
代码如下:

from flask import Flask, request
from proj.tasks import app, add, mul
from celery.result import AsyncResult

flask_app = Flask(__name__)


@flask_app.route('/add', methods=["POST"])
def celery_add():
    """
    执行add任务
    POST http://127.0.0.1:5000/add
    Body 为表单 参数为 args1,args2
    :return:
    """
    try:
        args1, args2 = request.form.values()
        print(f"获取到的参数:{args1},{args2}")
    except Exception as e:
        return str(e)
    result = add.delay(int(args1), int(args2))
    result_id = result.id
    print(f"任务id:{result_id}")
    return result_id


@flask_app.route('/get_result', methods=["GET"])
def get_result_id():
    """
    根据id获取任务结果
    GET http://127.0.0.1:5000/get_result?id=fd7cb7dc-5b1b-4e07-8199-dd89a0c08a2a
    :return:
    """
    result_id = request.args.get('id')
    async_result = AsyncResult(id=result_id, app=app)
    result = ""
    if async_result.successful():
        result = async_result.get()
        print(result)
        # result.forget() # 将结果删除
    elif async_result.status == 'PENDING':
        print('任务等待被执行')
    elif async_result.status == 'RETRY':
        print('任务异常后重试')
    elif async_result.status == 'STARTED':
        print('任务执行中')
    elif async_result.failed():
        print('任务执行失败')

    return str(result)


if __name__ == "__main__":
    flask_app.run("127.0.0.1", port=5000)

启动flask程序
通过postman进行调用测试:

  1. 调用add函数,获取任务id:


    image.png
  2. 获取对应id的结果:


    image.png
  3. 打开flower 查看调用过程 如下图:


    image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • 1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部...
    四号公园_2016阅读 28,714评论 5 60
  • 介绍 Celery 是一个基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果...
    _Cappuccino_阅读 12,946评论 0 0
  • 一. celery 简介 Celery 是一个专注于实时处理和任务调度的分布式任务队列, 同时提供操作和维护分布式...
    dinel阅读 5,926评论 0 2
  • Celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具。它是一个专注...
    EarthChen阅读 1,165评论 0 4
  • 在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式。 生产者消费者模式 在实际的软件开发过程中,...
    c2db9ba35639阅读 3,524评论 0 8