【应用】【python】RabbitMQ+多线程的应用

智能制造的快速落地,必然涉及工业互联网平台、工业 AI+、区域工业互联网,这些领域必然包含物联网、云计算、AI、大数据、协同等技术。

从具体落地情况来看,智能制造企业中常用的数据采集与监控系统(SCADA)中,必然涉及到消息队列+多线程的底层处理技术。因此,本文简单介绍一下基于python语言,如何实现消息队列和多线程之间的交互。


首先,在编写代码之前,明确我们的目的:

  1. RabbitMQ发送指令到消息队列;
  2. python读取消息队列里的内容指令(需注意,这里每个指令都需要反馈计算结果);
  3. python根据消息队列指令,在进程池里触发多进程;
  4. python将每个进程计算结果返回到RabbitMQ消息队列中。

理清楚我们的目的之后,我们需要注意以下几点:

  • 需要实例化两个RabbitMQ,一个用于接收MQ指令,另外一个用于返回计算结果到MQ消息队列中;
  • 为了提高计算效率,这里采用了进程池的技术,意味着当进程池子进程被全部占用之后,其他计算任务需等待进程池里子进程结束侯才能发起计算。

from concurrent.futures.thread import ThreadPoolExecutor
import pika
import json


class MQSub:
    def __init__(self, **args_in):
        self.username = args_in["username"]  # RabbitMQ用户名
        self.password = args_in["password"]  # RabbitMQ密码
        self.host = args_in["host"]  # RabbitMQ主机
        self.port = args_in["port"]  # RabbitMQ端口
        self.cmd_queue = args_in["cmd_queue"]  # RabbitMQ指令队列
        self.feedback_queue = args_in["feedback_queue"]  # RabbitMQ指令计算结果反馈队列

        """作为客户端"""
        credentials = pika.PlainCredentials(self.username, self.password)
        conn_mq = pika.BlockingConnection(
            pika.ConnectionParameters(host=self.host, port=self.port, virtual_host="/", credentials=credentials))
        self.channel = conn_mq.channel()

        # 声明消息队列,如果不存在将创建;并设置成永久类型。
        self.channel.queue_declare(self.feedback_queue, durable=True)
        # 定义回调函数,当消息队列中有新的通知时调用callback函数
        
    def user_defined_func(self):
        print("此处是用户自定义的函数")
        # 接下来对计算的结果,反馈到MQ消息队列中
        self.channel.basic_publish(exchange='', routing_key=self.feedback_queue, body=json.dumps(您想反馈的结果), properties=pika.BasicProperties(delivery_mode=2))
        
        
class MQ(MQSub):
    def __init__(self, **args_in):
        MQSub.__init__(**args_in)

    def mq_exec(self):
        """作为消费端"""
        credentials = pika.PlainCredentials(self.username, self.password)
        conn_mq = pika.BlockingConnection(pika.ConnectionParameters(host=self.host, port=self.port, virtual_host="/", credentials=credentials))
        channel = conn_mq.channel()
        
        # 声明消息队列,如果不存在将创建;并设置成永久类型。
        channel.queue_declare(self.cmd_queue, durable=True)
        # 定义回调函数,当消息队列中有新的通知时调用callback函数
        channel.basic_consume(self.cmd_queue, on_message_callback=self.callback)
        channel.start_consuming()
        channel.close()
    
    def callback(self):
        """回调函数:在新消息来的时候执行"""
        executor.submit(self.user_defined_func)  # 将任务提交到进程池里执行,user_defined_func是用户定义的函数,args_in入参
        

if __name__ == "__main__":
    executor = ThreadPoolExecutor(max_workers=10)  # 开启线程池,并且定义线程池里线程总数为10个

 后面实例化的部分,大家可根据具体问题再定义,我这里就不做过多的阐述。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

八号线土著

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值