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

关于celery的使用

时间:2024-10-05 16:12:20浏览次数:1  
标签:Celery task celery tasks result 使用 import 关于

celery是什么?

 

 

 

Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。

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

消息中间件

Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等

任务执行单元

Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。

任务结果存储

Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

另外, Celery还支持不同的并发和序列化的手段

  • 并发:Prefork, Eventlet, gevent, threads/single threaded
  • 序列化:pickle, json, yaml, msgpack. zlib, bzip2 compression, Cryptographic message signing 等等

使用场景:

celery是一个强大的 分布式任务队列的异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行。我们通常使用它来实现异步任务(async task)和定时任务(crontab)。

异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等

定时任务:定时执行某件事情,比如每天数据统计

Celery具有以下优点

Simple(简单)
Celery 使用和维护都非常简单,并且不需要配置文件。

Highly Available(高可用)
woker和client会在网络连接丢失或者失败时,自动进行重试。并且有的brokers 也支持“双主”或者“主/从”的方式实现高可用。

Fast(快速)
单个的Celery进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时)

Flexible(灵活)
Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。

Celery安装

pip install -U Celery

基本使用

创建项目celerypro

创建异步任务执行文件celery_task:

在celery_task目录下执行消费者

celery -A celery_task worker --loglevel=info

 

import celery
import time
backend='redis://127.0.0.1:6379/1'
broker='redis://127.0.0.1:6379/2'
cel=celery.Celery('test',backend=backend,broker=broker)
@cel.task
def send_email(name):
    print("向%s发送邮件..."%name)
    time.sleep(5)
    print("向%s发送邮件完成"%name)
    return "ok"

创建执行任务文件,produce_task.py:生产者直接run就ok

from celery_task import send_email
result = send_email.delay("yuan")
print(result.id)
result2 = send_email.delay("alex")
print(result2.id)  

注意,异步任务文件命令执行:

celery worker -A celery_app_task -l info

创建py文件:result.py,查看任务执行结果,

from celery.result import AsyncResult
from celery_task import cel

async_result=AsyncResult(id="c6ddd5b7-a662-4f0e-93d4-ab69ec2aea5d", app=cel)

if async_result.successful():
    result = async_result.get()
    print(result)
    # result.forget() # 将结果删除
elif async_result.failed():
    print('执行失败')
elif async_result.status == 'PENDING':
    print('任务等待中被执行')
elif async_result.status == 'RETRY':
    print('任务异常后正在重试')
elif async_result.status == 'STARTED':
    print('任务已经开始被执行')

 

多任务结构:

 celery.py:

from celery import Celery

cel = Celery('celery_demo',
             broker='redis://127.0.0.1:6379/1',
             backend='redis://127.0.0.1:6379/2',
             # 包含以下两个任务文件,去相应的py文件中找任务,对多个任务做分类
             include=['celery_tasks.task01',
                      'celery_tasks.task02'
                      ])

# 时区
cel.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
cel.conf.enable_utc = False

task01.py,task02.py:

#task01
import time
from celery_tasks.celery import cel

@cel.task
def send_email(res):
    time.sleep(5)
    return "完成向%s发送邮件任务"%res



#task02
import time
from celery_tasks.celery import cel
@cel.task
def send_msg(name):
    time.sleep(5)
    return "完成向%s发送短信任务"%name

produce_task.py:

from celery_tasks.task01 import send_email
from celery_tasks.task02 import send_msg

# 立即告知celery去执行test_celery任务,并传入一个参数
result = send_email.delay('yuan')
print(result.id)
result = send_msg.delay('yuan')
print(result.id)

check_result.py:

from celery.result import AsyncResult
from celery_tasks.celery import cel

async_result = AsyncResult(id="562834c6-e4be-46d2-908a-b102adbbf390", app=cel)

if async_result.successful():
    result = async_result.get()
    print(result)
    # result.forget() # 将结果删除,执行完成,结果不会自动删除
    # async.revoke(terminate=True)  # 无论现在是什么时候,都要终止
    # async.revoke(terminate=False) # 如果任务还没有开始执行呢,那么就可以终止。
elif async_result.failed():
    print('执行失败')
elif async_result.status == 'PENDING':
    print('任务等待中被执行')
elif async_result.status == 'RETRY':
    print('任务异常后正在重试')
elif async_result.status == 'STARTED':
    print('任务已经开始被执行')

开启work:celery worker -A celery_tasks -l info -P eventlet,添加任务(执行produce_task.py),检查任务执行结果(执行check_result.py)

如果第一个命令报错,请试试第二个:celery -A celery_tasks worker -l info -P eventlet

 如果提示 No module named 'eventlet'。需要安装 eventlet

pip install eventlet

Celery执行定时任务

 设定时间让celery执行一个定时任务,produce_task.py:

from celery_task import send_email
from datetime import datetime

# 方式一
# v1 = datetime(2020, 3, 11, 16, 19, 00)
# print(v1)
# v2 = datetime.utcfromtimestamp(v1.timestamp())
# print(v2)
# result = send_email.apply_async(args=["egon",], eta=v2)
# print(result.id)

# 方式二
ctime = datetime.now()
# 默认用utc时间
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
from datetime import timedelta
time_delay = timedelta(seconds=10)
task_time = utc_ctime + time_delay

# 使用apply_async并设定时间
result = send_email.apply_async(args=["egon"], eta=task_time)
print(result.id)

多任务结构中celery.py修改如下:

from datetime import timedelta
from celery import Celery
from celery.schedules import crontab

cel = Celery('tasks', broker='redis://127.0.0.1:6379/1', backend='redis://127.0.0.1:6379/2', include=[
    'celery_tasks.task01',
    'celery_tasks.task02',
])
cel.conf.timezone = 'Asia/Shanghai'
cel.conf.enable_utc = False

cel.conf.beat_schedule = {
    # 名字随意命名
    'add-every-10-seconds': {
        # 执行tasks1下的test_celery函数
        'task': 'celery_tasks.task01.send_email',
        # 每隔2秒执行一次
        # 'schedule': 1.0,
        # 'schedule': crontab(minute="*/1"),
        'schedule': timedelta(seconds=6),
        # 传递参数
        'args': ('张三',)
    },
    # 'add-every-12-seconds': {
    #     'task': 'celery_tasks.task01.send_email',
    #     每年4月11号,8点42分执行
    #     'schedule': crontab(minute=42, hour=8, day_of_month=11, month_of_year=4),
    #     'args': ('张三',)
    # },
}
启动beat程序 tasks是task01的上层目录名称和Celery生成的名字 celery -A tasks beat -l INFO

# 启动 Beat 程序$ celery beat -A celery_tasks# Celery Beat进程会读取配置文件的内容,周期性的将配置中到期需要执行的任务发送给任务队列 # 之后启动 worker 进程.$ celery -A celery_tasks worker -l info 或者$ celery -B -A celery_tasks worker -l info beat是类似单个任务的product,命令:celery -A tasks beat -l INFO work就是读消息队列执行:celery -A tasks worker -l info   linux通过systemctl启动
sudo systemctl daemon-reload

sudo systemctl enable flask
sudo systemctl start flask

sudo systemctl enable celery_worker
sudo systemctl start celery_worker

sudo systemctl enable celery_beat
sudo systemctl start celery_beat

celery配置日志:

from celery import Celery
from celery.schedules import crontab
from config import Config

def make_celery(app):
    celery = Celery(
        app.import_name,
        broker=Config.CELERY_BROKER_URL,
        backend=Config.CELERY_RESULT_BACKEND
    )
    celery.conf.update(app.config)
    celery.conf.beat_schedule = {
        'daily-task': {
            'task': 'app.tasks.daily_task',
            'schedule': crontab(hour=0, minute=0),  # 每天午夜执行
        },
    }
    celery.conf.update(
        worker_log_format='[%(asctime)s: %(levelname)s/%(processName)s] %(message)s',
        worker_task_log_format='[%(asctime)s: %(levelname)s/%(processName)s] [%(task_name)s(%(task_id)s)] %(message)s',
        worker_redirect_stdouts_level='INFO',
        worker_log_file='/var/log/celery_worker.log'
    )
    return celery

 

  redis查看队列任务: 在redis下执行命令 : lrange celery 0 -1  

标签:Celery,task,celery,tasks,result,使用,import,关于
From: https://www.cnblogs.com/anhao-world/p/18420357

相关文章

  • 帝国cms使用Linux系统数据盘扩容后宝塔控制面板数据盘大小不变的解决方法
    当遇到磁盘空间不足的情况时,可以通过以下步骤对数据盘进行扩容,并确保宝塔控制面板能够正确识别新的磁盘大小。以下是详细的步骤:步骤1:备份数据在操作硬盘扩容前,通过磁盘快照功能备份服务器系统盘与数据盘。步骤2:关闭服务器并购买磁盘空间关闭服务器。购买并等待配置完成......
  • 【VMware VCF】使用 PowerVCF 连接和管理 VMware Cloud Foundation 环境。
    VMware有一个非常强大的命令行工具叫PowerCLI,该工具是基于PowerShell开发的模块,主要用于在Windows环境中连接和管理传统虚拟化解决方案,比如vSphere、vSAN以及NSX等。之所以PowerCLI非常强大,是因为它几乎可以实现这些解决方案WEBUI中的所有管理操作,甚至更多。如果你......
  • 【VMware VCF】使用 SoS 实用程序检查 VCF 环境的运行状态以及收集相关组件的日志信息
    VMwareCloudFoundation解决方案中有一个叫SupportabilityandServiceability(VMwareCloudFoundationPart03:准备Excel参数表。”。同样,这个SoS程序也可以在SDDCManager虚拟机中使用,并且具有更多实用的功能,比如在VCF环境中运行状态检查以及收集相关组件的日志等,下......
  • MAC 安装 Homebrew (使用国内镜像源)
    Homebrew官方地址https://brew.sh/zh-cn/官方地址使用github的源,国内访问速度很慢,所以我们需要使用国内的源。自动安装Homebrew首先可以尝试自动安装方法,直接一行命令就行:/bin/zsh-c"$(curl-fsSLhttps://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"如果不......
  • Redis数据类型, Redis主从哨兵和集群(将数据导入集群) ubuntu使用
    2.5Redis常用命令2.5.1INFO显示当前节点redis运行状态信息(可以做监控用)#列出所有127.0.0.1:6379>info#列出具体块127.0.0.1:6379>infoMemory2.5.3SELECT切换数据库,相当于在MySQL的USEDBNAME指令注意:在Rediscluster模式下不支持多个数据库,会出现下......
  • 使用ValueConverters扩展实现枚举控制页面的显示
    1、ValueConverters本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase、ValueToBoolCon......
  • Redis安装管理, RDB, AOF ubuntu使用
    1.1Redis基础redis单线程处理用户请求,不用加锁。其他线程做别的工作1.2Redis安装Ubuntu安装Redis范例:基于官方仓库包安装(可以安装最新版本)#官方地址https://redis.io/docs/install/install-redis/install-redis-on-linux/#导入key[root@ubuntu2204~]#curl-......
  • 关于本书的一点想法
    在excel/wps这个圈子也混迹了好久了,虽然公式水平一直很菜,但是我见过的高手还真的不少,很多的我都认识,只不过他们不怎么认识我罢了。可以确定,这个比拼公式的江湖,公式比我短,比我精彩的,随便哪个QQ群都能拎出一大把,文笔比我好的同学,我同样数不过来,不怪我水平低,实在是人家真的很优秀,公......
  • django + redis + celery 异步任务
    目录结构E:.│db.sqlite3│Dockerfile│manage.py│requirements.txt│├─celery_tasks#自定义一个celery的工作目录││config.py#celery配置文件││__init__.py│││├─sms│tasks.py#worker任务│__init__.py│......
  • 帝国CMS7.2 手机网站使用教程
    下面为详细操作步骤:一、设置所有访问端统一的访问地址后台>系统>系统参数设置:网站地址:这个地址一定不要加上域名,比如设置为:/(默认安装后也是没有加上域名,如果自行修改过,请把域名去掉。)附件地址:这个地址必须加域名,比如设置为:http://www.5300.cn/d/file/ 或者给附件目录/d/file/绑......