分布式任务队列系统 celery 进阶

通过前面的入门,我们大概了解了celery的工作原理及简单的入门代码示例(传送门),下面进行一些稍微复杂的任务调度学习

多目录结构异步执行

在实际项目中,使用Celery进行异步任务处理时,经常需要将代码组织在多个目录和模块中,以便更好地管理和维护。下面展示如何在多目录结构下使用Celery进行异步任务执行。

项目结构

假设我们有以下项目结构:

在这里插入图片描述

1. 配置文件 (config/celery_config.py)

首先,我们需要配置Celery的broker和backend。在这个示例中,我们将配置文件放在 config 目录下。

broker_url = 'redis://localhost:32769/0'
result_backend = 'redis://localhost:32769/1'

2. 定义任务 (app/task1.py 和 app/task2.py)

接下来,在 app 目录下定义我们的任务函数。

task1

import timefrom celery_demo.multi_task.app.celery_worker import celery_app@celery_app.task
def send_email(name):print(f"开始给{name}发送邮件")time.sleep(1)return "done"

task2

import timefrom celery_demo.multi_task.app.celery_worker import celery_app@celery_app.task
def send_msg(name):print(f"开始给{name}发送短信")time.sleep(1)return "done"

3. 启动Worker (app/celery_worker.py)

为了能够启动worker来处理任务,我们需要编写一个脚本来启动它。在这个示例中,这个脚本放在 app/worker.py 中。

注意!:include参数的task路径必须写全,不然各种找不到模块报错

from celery import Celerycelery_app = Celery('celery_worker', include=['celery_demo.multi_task.app.task1', 'celery_demo.multi_task.app.task2'])
celery_app.config_from_object('celery_demo.multi_task.config.celery_config')# 时区
celery_app.conf.timezone = 'Asia/Shanghai'
# 是否使用UTC
celery_app.conf.enable_utc = False# 启动celery,准备好接收消息,一旦接收到消息就执行任务,并存储结果
if __name__ == '__main__':celery_app.worker_main(['worker', '--loglevel=info'])

运行命令启动Worker:

在根目录下:
celery -A celery_demo.multi_task.app.celery_worker worker --loglevel=info

或者直接运行该脚本:

/usr/bin/python3 /Users/fangyirui/PycharmProjects/pythonProject/celery_demo/multi_task/app/celery_worker.py 

或者pychram可以右键直接run

4. 主程序调用异步任务 (main.py)

最后,在主程序中调用这些异步任务。我们可以通过导入 add.delay() 或者其他方法来发送消息到消息队列。

from celery_demo.multi_task.app import task1, task2result1 = task1.send_email.delay('AA')
result2 = task2.send_msg.delay('BB')print(result1)
print(result1.get())
print(result2)
print(result2.get())

总结

在上述示例中,通过合理的项目结构,将不同功能模块分离开来,使得代码更加清晰易维护。具体步骤如下:

  1. 配置文件:定义了Celery的broker和backend设置。
  2. 定义任务:创建了包含具体业务逻辑的异步函数,并用@task装饰器标记为可被调度执行的task.
  3. 启动Worker:编写了用于启动celerey worker 的脚本,使其能够从消息队列拉取并执行相应操作.
  4. 主程序调用:通过导入task 模块中的方法,实现对某些操作发起异步请求.
  5. 注意各种模块的导包和引用需要把路径写全,不然就算pycharm不提示报错,运行时也会报错,博主我已经踩了很多坑了!

定时任务

代码结构目录

在这里插入图片描述

启动beat服务方式

配置 Celery 应用

创建一个名为 celery_worker.py 的文件,并配置你的 Celery 应用。

from datetime import timedeltafrom celery import Celery
from celery.schedules import crontabapp = Celery('celery_worker', broker='redis://localhost:32769/0', backend='redis://localhost:32769/1',include=['task'])app.conf.beat_schedule = {'add-every-seconds': {# 指定执行的任务'task': 'task.add',# 单位为秒,每10秒触发一次# 'schedule': 10.0,# corn表达式触发,每一分钟触发一次# 'schedule': crontab(minute="*/1"),# 每年6月5号,16点0分执行'schedule': crontab(minute=0, hour=16, day_of_month=5, month_of_year=6),# 每6秒执行一次# 'schedule': timedelta(seconds=6),'args': (16, 16)},
}
app.conf.timezone = 'Asia/Shanghai'

定义任务

创建一个名为 task.py 的文件,并定义你的任务。

from celery_worker import app@app.task
def add(x, y):print(f"执行成功: {x} {y} ,结果为{x + y}")return x + y

启动 Worker 和 Beat 服务

启动 worker:

celery -A celery_worker worker --loglevel=info

启动 beat:

celery -A celery_worker beat --loglevel=info

这样,Celery Beat 会按照你配置的时间间隔发送 add(16, 16) 的任务到队列中,而 Worker 会从队列中取出并执行这个任务。

单个任务时指定时间

send_task.py

from datetime import datetime
from datetime import timedeltafrom task import add# # 方式一
# # 如果是过去的时间,则会立马执行
# v1 = datetime(2024, 6, 5, 16, 5, 00)
# print(v1)
# # 如果不转utc时间,会比预计的晚8个小时才执行
# v2 = datetime.utcfromtimestamp(v1.timestamp())
# print(v2)
# result = add.apply_async(args=[5, 5], eta=v2)
# print(result.id)# 方式二
ctime = datetime.now()
# 默认用utc时间
utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())# 用当前时间延迟10秒执行
time_delay = timedelta(seconds=10)
task_time = utc_ctime + time_delay# 使用apply_async并设定时间
result = add.apply_async(args=[7, 7], eta=task_time)
print(result.id)

zsh: command not found: celery

问题描述

在终端执行celery的命令时报错,zsh: command not found: celery

但执行pip3 show celery查看已经安装过的celery时,发现安装没有问题:

➜ pythonProject pip3 show celery
Name: celery
Version: 5.4.0
Summary: Distributed Task Queue.
Home-page: https://docs.celeryq.dev/
Author: Ask Solem
Author-email: auvipy@gmail.com
License: BSD-3-Clause
Location: /Users/fangyirui/Library/Python/3.9/lib/python/site-packages
Requires: billiard, python-dateutil, click-didyoumean, click, click-repl, click-plugins, vine, kombu, tzdata
Required-by: 

在网上查阅其他解决方案后,问题仍没有解决,那么你很可能跟我一样还没有将 Python 二进制安装目录添加到 PATH 中。

解决方案:

在 .zshrc 文件中添加你的python/bin目录: /Users/fangyirui/Library/Python/3.9/bin

或者执行:

export PATH=$PATH:/Users/fangyirui/Library/Python/3.9/bin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试题】创建两个线程交替打印100以内数字(一个打印偶数一个打印奇数)

阅读导航 一、问题概述二、解决思路三、代码实现四、代码优化 一、问题概述 面试官:C多线程了解吗?你给我写一下,起两个线程交替打印0~100的奇偶数。就是有两个线程,一个线程打印奇数另一个打印偶数,它们交替输出&…

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本:20.10.25 k8s版本(kubeadm,kubelet和kubectl):1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …

根据word模板生成word内容(JAVA)

主要是借助 poi-tl 来实现业务需求 当时第一次尝试的是Apache poi不是很好用,不推荐 第二次是xml,找的眼睛都花了,不推荐 要求:jdk1.8,Apache POI5.2.2 我这里使用的是5.2.3版本 文档:Poi-tl Documentati…

「随笔」如何评价GPT-4o

关于GPT-4o的评价 方向一:对比分析 GPT(Generative Pre-trained Transformer)是一系列由OpenAI开发的预训练语言模型。从GPT-1到GPT-4,每一个版本都在模型规模、训练数据量和能力上有所提升。GPT-1是最初的版本,它引入…

Java 基础 - idea汉字输出乱码

在使用 IntelliJ IDEA 时,如果在控制台输出汉字出现乱码,通常是因为控制台的字符编码设置不正确。以下是解决这个问题的步骤: 1、设置 IDEA 控制台编码 1.1、修改 IDE 设置 打开 IntelliJ IDEA,点击 File 菜单,然后…

Next React

最新版的next在安装的时候&#xff0c;已经集成了React,不需要在单文件头部单独引入React,可以直接使用React语法。 一&#xff1a;路由跳转 import Link from next/link<Link href"/pathA">测试</Link> 最新版本的next中的Link 不需要在Link下一级使…

MySQL的联合索引及案例分析

1. 联合索引 关于联合索引的详解参考博客【Mysql-----联合索引和最左匹配】&#xff0c;包含讲解 最左匹配 联合索引失效的情况 不遵循最左匹配原则范围查询右边失效原理like索引失效原理 比较关注的点在于&#xff1a; 对A、B、C三个字段创建一个联合索引&#xff08;A, …

在线建站流程分析

建站流程是指通过互联网创建一个个人或企业网站的过程。随着互联网的发展&#xff0c;越来越多的人和机构开始意识到网络的重要性&#xff0c;建站成为一种常见的行为。在线建站的流程一般包括以下几个步骤。 首先&#xff0c;选择一个合适的建站平台。目前&#xff0c;有很多在…

前端逆向之查看接口调用栈

一、来源 再分析前端请求接口数据的时候&#xff0c;其中有一个sid不知道是前端如何获取的&#xff0c;一般情况下只需要全局搜搜sid这个字符串或者请求接口的名称就可以了&#xff0c;基本都能找到sid的来源&#xff0c;但是今天这个不一样&#xff0c;搜什么都搜不到 接口地…

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

Python连接数据库进行数据查询

Python连接数据库进行数据查询 mysql数据库&#xff08;mariadb&#xff09;连接数据库创建Cursor对象模块安装代码 Oracle数据库连接数据库模块安装代码 SQL server数据库连接数据库模块安装代码 mysql数据库&#xff08;mariadb&#xff09; 连接数据库 首先&#xff0c;你…

AI论文工具推荐

AI 在学术界的使用情况也比较疯狂&#xff0c;特别是一些美国大学&#xff0c;用 AI 来辅助阅读文献以及辅助写论文的越来越多&#xff0c;毕竟确实可以提高写作效率&#xff0c;特别是在文献综述和初稿生成方面。 但在科研界其实&#xff0c;发现看论文的速度已经赶不上发论文…

发现 Laravel 中的 api 响应时间明显过长

背景 近期在排查网站后台页面功能时 发现&#xff0c;部分查询页面&#xff0c;明显响应时间过长&#xff08;12秒&#xff09;&#xff0c;不合理 优先排查 接口运行时长 经过打印&#xff0c;发现代码是正常的&#xff0c;且时间仅需不到一秒 进一步怀疑是 VUE框架的渲染加载…

“粘土风格”轻松拿捏,基于函数计算部署 ComfyUI实现AI生图

阿里云函数计算 FC 一键部署火爆全球工作流 AI 生图平台—— ComfyUI &#xff0c;实现更高质量的图像生成&#xff0c;三步轻松完成“黏土”创意AI画作&#xff0c;晒图赢眼部按摩器等好礼&#xff01; 活动地址&#xff1a; https://developer.aliyun.com/topic/june/fcspma…

编写备份MySQL 脚本

目录 环境准备 增量备份 增量备份和差异备份 完整代码如下 测试脚本是否正常 星期天运行脚本&#xff08;完全备份&#xff09; 星期一运备份脚本&#xff08;增量备份&#xff09; 星期二备份数据&#xff08;其他天--增量备份&#xff09; 星期三备份数据&#xff08;差异备…

最大连续1 的个数Ⅲ(滑动窗口)

题目&#xff1a; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 首先&#xff0c;我们需要了解题干的意思&#xff1a;我们需要将给定的一个只有 0 和 1 的数组&#xff0c;最多将其中 k 个0改变…

EVASH vs. ATMEL vs. ST EEPROM 对比型号

EVASH vs. ATMEL vs. ST EEPROM 对比 型号对比 益华世ATMELSTEV24C128AAT24C128M24128EV24C256AAT24C256M24256EV24C512AAT24C512M24512 优势和劣势对比 品牌优势劣势EVASH- 供应链稳定性: 新兴品牌&#xff0c;可能在芯片市场紧缺的情况下提供较为稳定的供应。<br>- …

【强烈推荐】四元数与三维旋转

目录 1 强烈推荐讲解四元数与三维旋转的这篇文章&#xff0c;深入浅出2 笔记2.1 复数2.1.1 复数的定义2.1.2 复数的乘法与二维旋转 2.2 三维空间中的旋转2.2.1 角轴2.2.2 旋转的分解 2.3 四元数2.3.1 四元数的定义2.3.2 四元数的乘法2.3.3 四元数与三维旋转2.3.4 三维旋转的矩阵…

selenium自动化测试入门:下拉框元素定位

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 选择获取反选下拉框元素首先要实例化select元素 from selenium.webdriver.support.ui import S…

数字影像产业园的三大赋能:科技、创新与无限可能

数字影像产业园作为文创产业的重要载体&#xff0c;以科技为核心驱动力&#xff0c;不断推动产业的技术革新和升级。 园区内汇聚了最前沿的数字技术资源&#xff0c;高清摄影设备、虚拟现实技术、人工智能应用等尖端科技在这里得到广泛应用&#xff0c;不仅提升了生产效率&…