首页 > 编程语言 >python 异步任务框架 celery

python 异步任务框架 celery

时间:2022-10-21 09:55:44浏览次数:54  
标签:Celery myself 异步 python redis celery 任务 import

简介

celery 是一个分布式任务调度框架,由 python 编写。它专注于实时处理,在任务发布后,管理分配任务到不同的服务器,并取得结果。在执行任务分配时需要一个消息中间件(Broker),在 客户端 Worker 之间进行协调,比如:MQ/redis等。最后将任务返回的结果存储到数据库(Backend

 

Celery 使用

1、安装

使用 pip 命令安装

pip install celery

 

2、初始化

我的文件目录如下:

2.1 创建 celery_myself.py 文件,实例化 Celery 类

from celery import Celery

# celery_myself是当前模块的名称,可以省略,建议以当前模块名为名称
celery = Celery('celery_myself',
                # 选择中间件redis
                # broker='redis://sy-suz-test03:6379/0'
                # 选择中间件 rabbitmq
                broker='amqp://账号:密码@127.0.0.1:5672/tob')

# 注意这里,必须导入自定义的tasks任务到实例对象celery
# celery.conf['imports'] = ['core.tasks', ]
celery.conf.update(imports = ['core.tasks',])

2.2 创建 tasks.py 文件,定义任务函数

from core.celery_myself import celery

@celery.task
def fn(a, b):
    data = a*b
    print(f'参数{a}、{b}。计算结果{data}')
    return data

 

3、运行 worker 

 CD 到 celery_myself.py 目录下,执行以下命令:

celery -A celery_myself worker --pool=solo --loglevel=INFO

看到以下信息成功运行:

遇到一个问题,写这篇博客的时候,新建了一个虚拟环境运行demo,但运行命令时报错:ImportError: cannot import name 'Celery' from 'celery',排查了好久,我的另一个python虚拟环境是没问题的,网上也搜不到解决方法,后来google外网看到了一篇和我同样问题的帖子。原因是库 importlib-metadata 版本太高了和 celery 不兼容,将 importlib-metadata 降成 4.13.0 就OK了。

 

4、调用任务

创建 run.py 文件,调用任务函数

from core.tasks import fn

fn.delay(2,3)

通过调用任务的 delay 来执行对应的任务。celery 会把执行命令发送到 broker,broker 再将消息发送给 worker 服务来执行,如果一切正常你将会在 worker 服务的日志中看到接收任务和执行任务的日志。 

 

5、保存结果

修改 celery_myself.py 文件,增加 backend 参数,比如设置 redis 存储

from celery import Celery

# celery_myself是当前模块的名称,可以省略,建议以当前模块名为名称
celery = Celery('celery_myself',
                # 指定中间件 rabbitmq
                broker='amqp://账号:密码@127.0.0.1:5672/tob',
                # 指定存储数据库 redis
                backend='redis://127.0.0.1:6379/0')

再调用任务函数

from core.tasks import fn

res = fn.delay(2,3)
# 查看任务是否执行完成了。返回True表示执行完成,False表示未完成
print(res.ready())

查看 redis 数据,result 值为 6 。

 

6、在 Flask 框架下运用

先安装pip install flask-celery-helper,辅助处理 Celery 的初始化,运用 init_app() 方法。Flask 官方文档说是现在不需要再扩展了,但如果使用 工厂模式 创建app的时候 实例化Celery 的参数配置在app对象里的话,就得扩展使用 init_app() 来初始化参数。

 

标签:Celery,myself,异步,python,redis,celery,任务,import
From: https://www.cnblogs.com/shenh/p/16788709.html

相关文章

  • python的bug
    deffield_value_convert(data:List[dict])->List[dict]:#对列进行排序,并且对数据进行转换#分组项对应的列转换res:List[dict]=[]foriindata:......
  • python随笔
    python随笔type和object的区别1除object本身,任何类都继承object(object是继承关系顶点)特殊:B类继承A类,A类继承object,所以B还是间接继承了object2任何类都是由t......
  • 力扣605(java&python)-种花问题(简单)
    题目:假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组  flowerbed表示花坛,由若......
  • python | 算法-拓扑排序
    写在前面:我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!1️⃣参考链接:https://github.com/algorithmzuo/algorithmbasic......
  • Python: Singleton Pattern
    DuSingleton.pyimporthttplib2#https://pypi.org/project/httplib2/importosimportreimportthreadingimporturllibimporturllib.requestfromurllib.parse......
  • 什么 ? 陪玩都月入过忘拉~这不得python采集一下
    前言嗨喽~大家好呀,这里是魔王呐!  国企文员和游戏陪玩两个职业间,你会选择哪个?00后李明的答案是后者。今年3月,某二本院校应届毕业生李明,兜兜转转,没有找到特别合......
  • Python中while与for的嵌套
    1.while语句中嵌套while语句:i=1whilei<10:j=1whilej<=i:print("%d*%d=%-3d"%(i,j,i*j),end="")j=j+1i=i+1print(end="\n")2.while语句......
  • Python: Prototype Pattern
    DuPrototype.pyimportcopy##原型模式PrototypePatternDuPrototype。pyclassSelfReferencingEntity:def__init__(self):self.parent=None......
  • Python学习三天计划-1
    一、第一个Python程序配置好环境变量后打开CMD(命令提示符)程序,输入Python并回车然后,在里面输入代码回车即可立即执行Python解释器的作用是将Python代码翻译成计算机......
  • 2.6 利用Python读写文件中的内容
    #读取文件内容f=open('note.txt','r',encoding='utf-8')#有中文使用encoding='utf-8'text=f.readlines()print(text)f.close()#推荐的使用的方式with...as上下......