关于mqtt消息并发量处理的思考

1.模拟mqtt大量消息并发的场景

方式一:写一个进程,用while循环,用usleep函数,延时时微妙级别,一直发。最快1秒发1000*1000条消息

方式二:用多线程发,比如10个线程,每个线程发10000条数据

2.mqtt客户端订阅数据处理,这时候相当1秒要接收很多条数据。

方式一:在订阅接收消息的回调函数中不做任何处理,此时进程会一条条接收处理,并调用相应的回调函数,比如一个回调函数处理好使2秒,300条就是600秒。

好处:简单,会处理接收到的每一条消息。

缺点:耗时较长

方式二:每接收到一条消息就建立一个线程,并将topic,msg,len传递给线程函数。

缺点:当发送的消息过快时会造成topic的内容传递给线程出错。

有点:处理速度快。

实验数据:当发送消息间隔为0.3ms时,多线程处理正常,低于0.3ms时就会出错

当两次pub的消息间隔很短时会造成sub端多线程问题

 

目前pub间隔3um

sub开启线程间隔1um

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
在 Python 中实现高并发MQTT 消息发送可以使用多线程或协程来实现。以下是使用 Python 协程实现高并发 MQTT 消息发送的示例代码: ```python import asyncio import random import string import aio_pika import aio_paho_mqtt # 配置信息 MQTT_BROKER = "localhost" MQTT_PORT = 1883 MQTT_TOPIC = "test/topic" MQTT_MESSAGE_COUNT = 10000 CONNECTIONS_COUNT = 100 # 生成随机字符串 def random_string(length): return ''.join(random.choice(string.ascii_lowercase) for i in range(length)) # 发送 MQTT 消息 async def send_mqtt_message(): client = aio_paho_mqtt.Client() await client.connect_async(MQTT_BROKER, MQTT_PORT) for i in range(MQTT_MESSAGE_COUNT): message = random_string(10) await client.publish_async(MQTT_TOPIC, message, qos=0, retain=False) await client.disconnect_async() # 协程入口 async def main(): tasks = [] for i in range(CONNECTIONS_COUNT): tasks.append(asyncio.ensure_future(send_mqtt_message())) await asyncio.gather(*tasks) # 运行协程 loop = asyncio.get_event_loop() loop.run_until_complete(main()) ``` 在这个示例中,我们使用了 `aio_paho_mqtt` 库来实现异步的 MQTT 消息发送。我们使用 `asyncio.ensure_future()` 方法将多个协程添加到任务列表中,并使用 `asyncio.gather()` 方法将它们一起运行。这样就可以实现高并发MQTT 消息发送了。 需要注意的是,如果你想要使用多线程来实现高并发MQTT 消息发送,可以使用 `threading` 或 `concurrent.futures` 库来实现。但是由于 Python 的 GIL(全局解释器锁)限制,多线程并不能真正发挥多核 CPU 的性能,因此协程是更好的选择。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值