mqtt异步publish⽅法
Python基于mqtt异步编程主要⽤到asyncio及第三⽅库hbmqtt,这⾥主要介绍mqtt的异步发布及遇到的⼀些问题。 hbmqtt安装很简单,pip hbmqtt install.
1、主进程
1 loop = _event_loop()
2 loop.run_until_complete(run())
⾸先是connect,然后publish,整个过程是⼀个协程
1 run(): #协程主函数
2 await connect()室外高增益天线
3while True:
4try:
5 await publish()
6except Exception as ce:
7 ("Sender Error: %s" % ce)
2、Connect
这⾥connect没有使⽤⾃动重连机制connect(),⽽是单独开⼀个协程执⾏掉线后⾃动重连_auto_reconnect
重连函数,每隔1s执⾏⼀次:
1 async def _auto_reconnect(client):
2while True:
3if not ansitions.is_connected(): #如果已经连接上则不执⾏重连
4try:
5 ect()
6except ConnectException:
7pass
糖尿病检测仪
8 await asyncio.sleep(1)
连接函数,仅执⾏⼀次,并启动重连函数协程
1 async def connect():循环水旁滤器
可乐杯2 client = MQTTClient(config={"auto_reconnect": False}) #False时关闭⾃动重连
3try:
4 t(url)
5except ConnectException:
6pass
视频无线传输
7 sure_future(_auto_reconnect(client))
3、Publish:
发布函数⽐较简单,主要就是
1 await client.publish(topic, msg)
4、总结
这⾥重点讲为什么协程时不要⾃动重连,因为如果publish过程中出现断线,需要等待连接成功的event,如果允许⾃动重连"auto_reconnect": True,程序在publish 程序等待信号不退出,⽆法进⼊connect程序执⾏reconnect,这样就永远等不到信号,造成程序死等,类似死机。 如果不允许⾃动重连,单开⼀个协程执⾏重连操作,即使publish协程等待事件,重连协程会使这个事件响应,这样就可以继续发布。
在hbmqtt库⾃带例⼦中多是先connect,然后publish,然后disconnect,以此循环,但主要考虑到连接后不主动断开⼀提⾼程序效率,故没有断开操作。
这个问题的解决⽅式可能有点牵强,园友们有没有遇到过类似的问题,在publish过程中关闭mqtt服务器,再重新打开服务器,发布任务能够继续正常执⾏,如果有好的解决⽅式,还望不吝赐教。