首页 > 其他分享 >celery的使用

celery的使用

时间:2024-02-08 21:33:05浏览次数:48  
标签:task app broker celery 任务 使用 import

 

Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理

celery的架构由三部分组成,消息中间件(message broker)、任务执行单元(worker)和任务执行结果存储(task result store)组成

 

安装celery模块

pip install celery

 

 

# 1 异步任务框架,执行异步任务,执行延迟任务,执行定时任务
# 2 Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please don’t open any issues related to that platform.
# 3 使用
-pip install celery
# 4 两种结构

 

 

 

 

#1  只写一个py文件,内容如下celery_task.py:

# broker='redis://:[email protected]:6379/1'
# :123456@是密码(没有就不写) 1是redis中库1的位置
from celery import Celery
broker='redis://127.0.0.1:6379/1'  #broker任务队列
backend='redis://127.0.0.1:6379/2'   # 结构存储,执行完的结果存在这
app=Celery(__name__,broker=broker,backend=backend)
#添加任务(使用这个装饰器装饰,@app.task)
@app.task
def add(x,y):
    print(x,y)
    return x+y
# 2启动worker
        # 用命令来执行
        # 非windows
        # 命令:celery worker -A celery_task -l info
        # windows:
        # pip3 install eventlet
        # celery worker -A celery_task -l info -P eventlet
        
# 3 添加任务
    from celery_task import add
    # add(3,4)  # 直接执行,不会被添加到broker中
    ret=add.delay(5,4)  #想broker中添加一个任务
    print(ret)
# 4 查看任务执行结果
    from celery_task import app
    from celery.result import AsyncResult
    id = '3e397fd7-e0c1-4c5c-999c-2655a96793bb'
    if __name__ == '__main__':
        async = AsyncResult(id=id, app=app)
        if async.successful():
            result = async.get()
            print(result)
        elif async.failed():
            print('任务失败')
        elif async.status == 'PENDING':
            print('任务等待中被执行')
        elif async.status == 'RETRY':
            print('任务异常后正在重试')
        elif async.status == 'STARTED':
            print('任务已经开始被执行')
View Code

 

2.包结构

#1 新建一个包,叫celery_task
    -celery_task
        -__init__.py
        -celery.py
        -task1.py
        -task2.py
# 2 celery.py
    from celery import Celery
    broker='redis://127.0.0.1:6379/1'  #broker任务队列
    backend='redis://127.0.0.1:6379/2'# 结构存储,执行完的结果存在这
    app=Celery(__name__,broker=broker,backend=backend,include=['celery_task.task1','celery_task.task2'])
    
# 3 task1.py
    from .celery import app
    @app.task
    def add(x,y):
        print(x,y)
        return x+y
# 4 task2.py
    from .celery import app
    @app.task
    def mutile(x,y):
        print(x,y)
        return x*y
# 5 添加任务(异步任务,延迟任务)
    from celery_task.task1 import add
    from celery_task.task2 import mutile
    #  提交异步
    ret=add.delay(6,7)
    print(ret)  # 2d4ad592-9548-4c7c-8df4-7f8583e8a1b1
    
    # 提交延迟任务
    from datetime import datetime, timedelta
    # 需要utc时间
    eta=datetime.utcnow() + timedelta(seconds=10)
    ret=add.apply_async(args=(240, 50), eta=eta)
    print(ret)

# 6获取结果同上
View Code

3.定时执行任务  此处的ret打印出来的结果就是id号

#1 celery.py

    from celery import Celery
    broker='redis://127.0.0.1:6379/1'  #broker任务队列
    backend='redis://127.0.0.1:6379/2'   # 结构存储,执行完的结果存在这
    app=Celery(__name__,broker=broker,backend=backend,include=['celery_task.task1','celery_task.task2'])
    # 执行定时任务
    # 时区
    app.conf.timezone = 'Asia/Shanghai'
    # 是否使用UTC
    app.conf.enable_utc = False
    # 任务的定时配置
    from datetime import timedelta
    from celery.schedules import crontab
    app.conf.beat_schedule = {
        'add-task': {
            'task': 'celery_task.task1.add',
            # 'schedule': timedelta(seconds=3),
            'schedule': crontab(hour=8, day_of_week=1),  # 每周一早八点
            'args': (300, 150),
        }
    }
    
# 2 启动worker,启动beat
    -celery worker -A celery_task -l info -P eventlet
    -celery beat -A celery_task -l info
View Code

 

标签:task,app,broker,celery,任务,使用,import
From: https://www.cnblogs.com/97zs/p/18012151

相关文章

  • gtkmm4 应用程序使用 CSS 样式
    目录前言css选择器css文件示例源代码效果前言程序样式和代码逻辑分离开使代码逻辑更可观css选择器Cambalache提供了两种css-classes相当于css里的类名:class="类名"css-name相当于css里的标签名:spindivp啥的如上我设置了这个按钮控件的类名为testButton标签名......
  • 使用sing-box搭建socks5转爱快路由器
    /etc/sysctl.confnet.ipv4.ip_forward=1/etc/sing-box/config.json{"log":{"level":"error"},"inbounds":[{"tag":"0","type":"tun",&qu......
  • [css] SVG的使用
    使用svg代替iconfont的好处:iconfont无法显示复杂的图形;svg是矢量图;svg标签内部可以添加title和desc标签,有利于SEO和无障碍阅读。svgsprite图:将若干个svg图标组合到一个文件上,可以减少网络请求的次数,通过#获取指定的图标:<svgclass="icon"><usexlink:href="img/sprit......
  • 如何使用graalvm为带有反射功能的java代码生成native image
    译自ConfigureNativeImagewiththeTracingAgentgraal官方文档,以下所有命令需要在linux环境下操作,graalvm也支持windows。要为使用Java反射、动态代理对象、JNI或类路径资源的Java应用程序构建本机可执行文件,应为native-image工具提供JSON格式的配置文件或在代......
  • Asp-Net-Core学习笔记:3.使用SignalR实时通信框架开发聊天室
    SignalR牛刀小试在MVP杨老师的博客里看到这么个东西,我还以为是NetCore3才推出的新玩意,原来是已经有很多年的历史了,那看来还是比较成熟的一个技术了。简介SignalR是一个.NETCore/.NETFramework的开源实时框架,SignalR的可使用WebSocket,ServerSentEvents和LongPolling......
  • WPF中值转换器的使用
    什么是值转换器在WPF(WindowsPresentationFoundation)中,值转换器(ValueConverter)是一种机制,允许你在绑定时转换绑定源和绑定目标之间的值。值转换器实现了IValueConverter接口,该接口包含两个方法:Convert和ConvertBack。这两个方法分别用于在绑定源到目标时进行值转换,以及在目......
  • spring-cloud-stream-rabbitmq 3.1.1使用
       1.引入springcloud,springcloudalibaba,springboot依赖<!--SpringCloud微服务--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-......
  • 使用Markdown写blog(不包含源代码)
    使用Markdown写blog(不包含源代码)标题三级标题四级标题可以自己添加几级标题字体Hello,worldHello,worldHello,worldHello,world引用狂神说java分割线图片超链接[点击跳转到bilibili](哔哩哔哩(゜-゜)つロ干杯~-bilibili)列表有序列表一二三无序......
  • 数据库迁移工具--DBMotion使用教程
    DBMotion安装与使用1.访问地址DBMotion,数据库迁移|Squids.cn2.下载docker-compose.yaml点击下载docker-compose.yaml配置文件https://squids.cn/download/dbmotion/docker-compose.yamlversion:'3.0'services:dts-mysql:image:mysql:latestcontaine......
  • 在spring场景下同时使用Mockito进行集成测试
    转自:GPT回答https://chat.openai.com/share/07721c36-f18e-429f-b570-d8e14b4d8b37Mockito@InjectMocks测试February8,2024 Anonymous如何使用@InjectMocks测试被代理对象ChatGPTChatGPT使用@InjectMocks来测试被代理对象是一种......