Sqlite3+RabbitMQ+Celery Python从零开始搭建一个持久化层的生产者消费者服务模型

python celery 和 rabbitmq结合 在使用Python的Celery与RabbitMQ结合时,你可以创建一个基于消息队列的任务队列系统,这对于处理异步任务和分散计算负载非常有用。pip install celery[redis] # Celery 需要 redis 作为消息代理,尽管你也可以用其他如 RabbitMQpip install pika # RabbitMQ 的 Python 客户端对于RabbitMQ,你通常需要安装RabbitMQ服务器并运行它。你可以从 RabbitMQ的官方网站 下载并安装。 阅读详情

1. 一张图说明我们接下来要造什么:

在这里插入图片描述
本次实验所使用到的玩具:

【1】RabbitMQ:消息队列中间件,做broker角色

【2】Celery:异步调度中间件,做workers的调度者(包工头)

【3】Sqlite:异步计算结果存储的角色

我们的 workers 可以理解为多进程/多线程,然后通过Celery来进行智能化的调度,至于他怎么调度的我们暂时不关心,然后我们使用RabbitMQ作为消息队列缓存的中间服务,当我们接收到生产者的数据的时候就会统一访问到我们的Celery进行调度执行,然后我们可以通过Celery来异步获取计算结果,当然了我们不想等待可以完全交给他执行,他执行完会把数据存入到结果数据库,我们再通过Celery来访问结果数据库(Backend)来获取我们之前计算的结果。

2. 安装配置顺序

  • Step1: 安装Erlang(Erlang是一种通用的面向并发的编程语言)
  • Step2: 安装RabbitMQ(第三方消息缓存中间件)
  • Step3: 安装Sqlite3并配置环境变量
  • (可选)安装SqliteStudio来预览数据库数据
  • Step4: Python 安装 celery
  • Step5: 启动 RabbitMQ服务并测试可视化UI
  • (可选)配置VSCode-Celery任务启动
  • Step6: 编写Worker-Python代码(消费者)
  • Step7: 编写Producer-Python代码(生产者)
  • Step8: 新建一个DB数据库
  • Step9: 启动 celery 绑定 broker到RabbitMQ,绑定backend到新建的DB数据库
  • Step10: 发起Producer的处理请求
  • Step11: 通过任务ID来访问曾经处理过的任务
  • —— 完成

3. 安装需要的文件:

在这里插入图片描述
打包下载地址

4. 配置详细步骤


4.1 安装 Erlang

双击安装 otp_win64_23.2.exe

RabbitMQ是用Erlang写的,所以必须安装Erlang虚拟机


4.2 安装 RabbitMQ

也是双击安装


4.3 安装Sqlite3驱动并配置环境变量

在电脑任意一个地方新建一个文件夹用来存Sqlite3数据库驱动,比如我手动新建:sqlite 目录在

C:\Program Files\sqlite

那么你的Path环境变量新建一个的时候就需要把这个目录填上。因人而异,弱智操作,自行体会。
在这里插入图片描述
然后把那些和sqlite有关的解压,复制到自己的目录:(结果如下)
在这里插入图片描述


4.4 Python 安装 celery

pip install celery

4.5 启动 RabbitMQ服务并测试可视化UI

我们可以看到我们新安装的程序里:
在这里插入图片描述
可以从这里启动,也可以直接跑到RabbitMQ的老家那里去启动:

启动管理插件:sbin/rabbitmq-plugins enable rabbitmq_management
启动rabbitmq:sbin/rabbitmq-server -detached

WEB-UI 管理地址:http://localhost:15672/,自己找他在哪个端口刨出来的,官网有说到,另外自己可以从启动输出的日志找到哦

在这里插入图片描述
默认密码和账户都是:guest

打开:
在这里插入图片描述


4.6 编写Worker-Python代码(消费者)

新建一个DB数据库放在同一个目录,这个就省略操作了。
在这里插入图片描述
不用建表,到时候celery自己会建表的。

from celery import Celery
import sqlite3
broker = 'amqp://guest@localhost//' #缓存消息队列
backend = 'db+sqlite:///qw.db' #结果暂存数据库
app = Celery('task', broker=broker, backend=backend)

# param1:app的名字,也就是这个代码文件的名字
# param2:消息中间件,amqp协议访问消息队列,我们使用RabbitMQ,你可以用Redis(严格来说他不是消息队列,而是持久化内存数据库)
# param3:结果存储

# 当我们启动任务的时候可以通过异步进行获取结果,也可以通过查询任务id来对结果数据库访问查询

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

注意一下协议的格式,特别是像sqlite这种小数据库,celery+sqlite用法的资料并不多,但无奈不想装MySQL先用lite来替代着。


4.7 编写VSCode 任务命令

在这里插入图片描述
在这里插入图片描述
或者你可以在命令同目录下启动:celery -A task worker --loglevel=info

注意:task 是我的这个代码的名字(严格来说是app的名字)


4.8 启动 celery

在这里插入图片描述


4.9 编写生产者

简单的用法我都写在下面了:

from task import add

# 我们通过Celery执行worker的代码
# 然后再通过Celery取数据出来,再写入数据库
# 注意在只有一个参数要传时 需要写成列表的形式[v1,]

# 这个时候只有在Celery服务器启动的时候才能进行
# Method1 异步获取数据结果
re = add.apply_async((23,1)) # do 23+1
print(re.get())

'''
# Method2 异步获取数据结果
re = add.delay(23,1)
print(re.get())
'''

'''
# 根据任务ID去获取以前计算的结果
re = add.AsyncResult('0b0ebce2-cb17-4b32-8847-68d793205009')
print(re.get())
'''

如上演示了:add这个函数的并发命令执行

我们执行完可以去SQLiteStudio看下:
在这里插入图片描述
首先他自己建表了,result就是我们的执行结果,你不要自己尝试是写Sqlite的代码去访问他的result数据,这是不对的,这个序列化的数据是Celery写进来的,至于他是怎样编码的鬼知道,我们正确的操作应该是再通过Celery去访问,可以根据任务ID去获取曾经计算的结果。

re = add.AsyncResult('0b0ebce2-cb17-4b32-8847-68d793205009')
print(re.get())

OK,至此完成了一个持久化层的生产者消费者服务模型搭建。

这个教程当玩具玩下还是可以的,具体的生产环境各种注意事项有空再写吧,学无止境。

Sqlite3+RabbitMQ+Celery Python从零开始搭建一个生产者消费者服务模型配套安装文件 立即下载

相关推荐

sqlite网络中间件(适用于cs架构开发)-易语言

自己做的sqlite网络中间件,适用于cs架构开发。一个客户Duan访问数据库的时候,会自动加锁,访问后解锁,避免多个客户Duan同时访问锁定数据库. 源码中大部分函数是按照 易语言 sqlite组件中的函数做的。我就不写帮助了.大家看知识库就行. 我是做个例子, 开发的时候如果直接调用会很慢。 另有几个以"快_"开头的函数,是我自己开发常用的.速度比较快. 服务器客户Duan架构,需要自己开发对应的函数,提高效率.我是做个例子,大家按照里面的思路开发即可. sqlite数据库要放到服务器程序运行目录下的data目录中才行 原理就是把客户Duan对服务器的方案写成json格式文本,传到服务器上,服务器在访问数据库后,返回json格式文本. 另外,函数中用了"zyjson模块"和" 精易模块 ",在此对作者表示感谢.

Celery学习与使用

引入 有了Celery,我们在使用生产者消费者模式时,只需要关注任务本身,极大的简化了开发者的开发流程 介绍 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行 Celery是一个功能完备即插即用的任务队列 单个 Celery 进程每分钟可处理数以百万计的任务 通过消息进行通信,使用**消息队列(broker)**在客户端和消费者之间进行协调 Celery特性 Celery 需要一个发送和接受消息的传输者 Celery可以使用RabbitMQ 和 Redis 作为中间人进行消息传

wutongheihei666的博客 335

弘玑RPA进阶攻略

01.弘玑RPA产品概要。02.设计器的安装与卸载。03.设计器特性与使用。

长安诗社社长@-梁瀚文- https://github.com/HevnChin https://gitee.com/HevnChin 3640

单服务器上的 Django 第一部分:Celery

Celery 是一个异步任务运行器,这意味着它允许您在正常的请求-响应周期之外运行任务,而正常的请求-响应周期对任务的执行时间有限制。例如,假设我们正在运行一个小部件工厂,但我们需要重新划分我们的样条线,但这需要的时间超过了一次请求-响应周期所能处理的时间。让我们把这个任务交给 Celery。我们想使用数据库作为我们的代理。我们可能仍会使用 Redis 或 RabbitMQ 作为我们的代理,因为要求我们在单个服务器上运行,这仍然能满足该要求,但让我们让它变得有趣并使用我们的默认 SQLite3 数据库。

weixin_48967543的博客 524

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5526

QGIS:安装Deepness插件+应用

简单的描述了deepness的安装应用历程,重点是记录博主本次遇到的坑

fengyi157的博客 2330

celery的用法详解

Celery 是一个开源的分布式任务队列框架,用于在分布式系统中进行异步任务调度和处理。它使用消息代理(如 RabbitMQ、Redis)来实现任务的发布和消费,支持任务的并发执行、定时调度和结果收集。

liulanba的博客 4090

基于数字图像处理方法的迷宫问题图解 : 基于骨架提取、四邻域

问题是,这条红色的线是人为标记出来的能通的路线,对计算机来看,黑色和红色的线没有任何差异,所以之前的想法压根不起作用。对应于数字图像的表达,就是从远离主干的分支端点出发,如果4邻域中只有一个可以通的道路,那么这个点在分支上。闪电划过,有一道连接了天空和大地,就是迷宫的解,其余的分支就是迷宫中对应的死路。类似这个闪电图,假设图中最粗的主干(迷宫解的路线)是最先形成的,其余的细小的分支是慢慢从主干上形成的。因此,只要在端点的4邻域中,找到可以走的道路,那么一定就是分支,也就是要移除的路线。

Henry的博客 2073

使用 SQLite 实现的简单工作队列

我们需要一种方法将带有参数的任务从一个 Python 进程传递到另一个进程。我在这里选择 SQLite,因为它是一项很棒的技术,并且内置于标准库中。但归根结底,将数据从一个进程传递到另一个进程并不困难。而且 sqlite 一次只允许一个写入器,所以我认为与 Postgres 这样的数据库相比,竞争条件方面不用担心。在本文中,我将探讨如何仅使用 SQLite 实现类似 Celery 的功能。如果我能做更多解释,请告诉我。为 1 将任务标记为正在运行,并通过设置为 2 将任务标记为已运行。

weixin_48967543的博客 486

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 923

STM32CubeMX之SDIO+FatFS读写SD卡

“SD卡/TF卡的读写是嵌入式系统中常用的功能。而SD卡的本质是一种flash存储器,通过单片机可以直接读写,但若要被电脑识别,则需要文件系统的支持。本篇文章主要介绍通过单片机的SDIO...

zhang062061的专栏 1897

AI Agent长任务管理:从状态持久化到中断恢复的工程实践

在构建生产级AI应用时,长任务管理是确保系统可靠性的核心技术。其核心原理在于将复杂的AI工作流进行状态持久化与异步执行,通过设计鲁棒的状态机与检查点机制,实现任务的可控中断与恢复。这一技术价值在于,它使得依赖大模型、执行路径不确定的AI Agent能够像传统后台作业一样,具备生产环境所需的韧性,支持用户随时取消、重试与暂停恢复操作。典型的应用场景包括自动文档分析、数据清洗、持续信息搜集与报告生成等耗时较长的自动化流程。本文深入探讨了如何为AI Agent构建一套完整的长任务管理基础设施,涵盖状态机设计、协作

weixin_34253126的博客 406

FPGA纯Verilog实现I²C主机控制器与EEPROM读写

I²C是一种广泛应用的同步串行总线协议,用于连接微控制器与EEPROM、传感器等低速外设。其核心原理包括开漏结构、主从通信机制、START/STOP时序及ACK/NACK应答流程。技术价值在于硬件资源占用少、布线简洁、支持多从机扩展,特别适合FPGA嵌入式系统中轻量级外设控制。典型应用场景涵盖工业数据存储、配置参数持久化及实时传感器接口。本文基于Xilinx Spartan-6 FPGA,采用纯Verilog HDL实现参数化I²C主机控制器与AT24C02 EEPROM读写验证,深入解析状态机设计、SDA

weixin_33557333的博客 119

异步方案celery+rabbitmq小结(python、django)

实际开发过程中遇到的问题: 在开发网页的过程中,如果遇到网络请求这样的耗时操作,将会给用户在使用网页的时候带来不好的体验效果。比如说在注册账户的时候,用户点击了请求手机验证码的操作,但由于网络请求的延时的问题,导致网站的请求界面没有任何的反应,如倒计时提示60秒后可以再次请求一次验证码,给用户造成自己没有点击成功的错觉等不好的用户体验效果。 如何解决这样的问题呢? 异步发送短信 将发送短信和界面响应的分开执行,开启一个子进程来执行发送短信的任务。 上面的方案又存在什么样的缺陷呢? 假如现在用户注册的需要执行

73 1487

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python处理rabbitmq的数据_荐Python Celery和RabbitMQ实战教程

前言Celery是一个异步任务队列。它可以用于需要异步运行的任何内容。RabbitMQ是Celery广泛使用的消息代理。在本这篇文章中,我将使用RabbitMQ来介绍Celery的基本概念,然后为一个小型演示项目设置Celery 。最后,设置一个Celery Web控制台来监视我的任务基本概念来!看图说话:BrokerBroker(RabbitMQ)负责创建任务队列,根据一些路由规则将任务分派到任...

weixin_42153801的博客 494

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

2-SQLite中间件

本文整理了SQLite3 中间件 sqlite_modern_cpp 的使用方法,相比于一些 orm 中间件,它简单而纯粹。

weixin_42182822的博客 624

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Celery 学习教程(一)简单认识celery

Celery常见的三大功能: 1.消息队列 2.异步任务 3.定时任务 需要了解的知识 选择并安装消息容器(载体) 安装celery 并 创建 一个任务 并开启工作进程并调用任务 记录工作状态和返回的结果 下面是官网: https://docs.celeryproject.org/en/stable/getting-started/first-steps-with-celery.html#choosing-a-broker 英文不太友好,可以.

qq_36582955的博客 1216

探索灵活定时任务管理:celery-sqlalchemy-scheduler

探索灵活定时任务管理:celery-sqlalchemy-scheduler 在现代软件开发中,定时任务的调度是不可或缺的一部分,特别是在微服务架构和分布式系统中。今天,我们要向您介绍一款强大的开源工具——celery-sqlalchemy-scheduler,它巧妙地将Celery的强大任务处理能力和SQLAlchemy的关系型数据库管理能力结合在一起,为您的应用提供了一个灵活的定时任务解决方案...

gitblog_00040的博客 746

一个简单的Demo展示fastapi+tortoise-orm+celery如何搭配

8. 启动Celery Worker。1. 创建并激活虚拟环境。3. 配置数据库连接参数。4. 定义表结构(直接从。9. 打开浏览器验证效果。5. 配置celery。

jaket5219999的博客 1046

.NET 通过ORM操作SQLite

本篇是.net 中 使用 SQLite(普通版)( https://blog.youkuaiyun.com/qq_23219257/article/details/132171167) 的进阶篇。在现代软件开发中,使用数据库是不可或缺的一部分。对于.NET开发者来说,SQLite是一种常用的轻量级关系型数据库。为了更方便地与数据库进行交互,开发者通常使用ORM(对象关系映射)工具。本文将介绍在.NET平台上如何使用ORM操作SQLite数据库,以实现轻便快捷的使用SQLite。

来山海 890

python学习[4]: 用python celery + rabbitMQ搭建并行分布式框架及验证

任务解耦(分布式并发处理):假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。生产者直接调用消费者的某个方法,还有另一个弊端:由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只好一直等在那

Power of technology will free your body and spirit 3576

Python Celery和RabbitMQ实战教程

用实际例子讲解Celery跟RabbitMQ

吴秋霖的博客 1万+

轻松搭建SQLite RESTful API:Sqlite To Rest项目推荐

轻松搭建SQLite RESTful API:Sqlite To Rest项目推荐 项目介绍 在现代Web开发中,RESTful API已经成为了数据交互的标准方式。然而,对于许多开发者来说,手动编写CRUD(创建、读取、更新、删除)操作的代码是一项繁琐且重复的工作。为了简化这一过程,Sqlite To Rest项目应运而生。该项目是一个基于Koa框架的中间件,旨在通过RESTful API自动暴...

gitblog_00651的博客 999

Esqlite:Erlang与SQLite的完美结合

Esqlite:Erlang与SQLite的完美结合 项目介绍 Esqlite是一个为Erlang设计的SQLite3 NIF(Native Implemented Function)库。它允许开发者在Erlang环境中无缝使用SQLite数据库,提供了一种高效、快速的数据库访问方式。Esqlite不仅支持嵌入式SQLite版本,还允许用户使用系统提供的SQLite库,极大地增强了其灵活性和兼容性...

gitblog_00030的博客 446

一文彻底搞懂流水线的调度问题,看完不懂打我

流水线的调度问题 流水线的调度问题相对来说比较复杂,我们只讲单功能的非线性流水线调度问题,已经可以从中深刻体会流水线的调度思想了。 下面我将用最最通俗的大白话来讲述你们课本看不懂的流水线调度问题,看完不懂来打我。 疑惑1:流水线为什么会产生冲突? 首先,只有非线性流水线才需要调度,为什么呢?因为会产生过程冲突啊才需要调度的。 那我们继续想,为什么非线性流水线会产生过程冲突呢,而线性流水线不会有过程冲突呢? 我们要先弄懂非线性流水线是啥子玩意:非线性流水线是指有反馈回路的流水线,如下图(之前讲流水线分类的

晋图的非正常人类胡言乱语集合 1万+
上一篇: Python 多线程和多进程的生产者消费者模型
下一篇: 用 Python 写一个分布式的代码在线评判系统(项目地址)
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值