mqtt异步publish方法
Python基于mqtt异步编程主要用到asyncio及第三方库hbmqtt,这里主要介绍mqtt的异步发布及遇到的一些问题。
hbmqtt安装很简单,pip hbmqtt install.
mqtt服务器我使用的是mosquitto.
1、主进程
主进程执行下面语句就实现了协程
loop = asyncio.get_event_loop()
loop.run_until_complete(run())
首先是connect,然后publish,整个过程是一个协程
run(): #协程主函数
await connect()
while True:
try:
await publish()
except Exception as ce:
logger.error("Sender Error: %s" % ce)
2、Connect
这里connect没有使用自动重连机制connect(),而是单独开一个协程执行掉线后自动重连_auto_reconnect
重连函数,每隔1s执行一次:
async def _auto_reconnect(client):
while True:
if not client.session.transitions.is_connected(): #如果已经连接上则不执行重连
try:
await client.reconnect()
except ConnectException:
pass
await asyncio.sleep(1)
连接函数,仅执行一次,并启动重连函数协程
async def connect():
client = MQTTClient(config={"auto_reconnect": False}) #False时关闭自动重连
try:
await client.connect(url)
except ConnectException:
pass
asyncio.ensure_future(_auto_reconnect(client))
3、Publish:
发布函数比较简单,主要就是
await client.publish(topic, msg)
4、总结
这里重点讲为什么协程时不要自动重连,因为如果publish过程中出现断线,需要等待连接成功的event,如果允许自动重连"auto_reconnect": True,程序在publish程序等待信号不退出,无法进入connect程序执行reconnect,这样就永远等不到信号,造成程序死等,类似死机。
如果不允许自动重连,单开一个协程执行重连操作,即使publish协程等待事件,重连协程会使这个事件响应,这样就可以继续发布。
在hbmqtt库自带例子中多是先connect,然后publish,然后disconnect,以此循环,但主要考虑到连接后不主动断开一提高程序效率,故没有断开操作。
这个问题的解决方式可能有点牵强,园友们有没有遇到过类似的问题,在publish过程中关闭mqtt服务器,再重新打开服务器,发布任务能够继续正常执行,如果有好的解决方式,还望不吝赐教。
mqtt异步publish方法的更多相关文章
- jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法
jquery ajax success 函数 异步调用方法中不能给全局变量赋值的原因及解决办法 在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们 ...
- 你所必须掌握的三种异步编程方法callbacks,listeners,promise
目录: 前言 Callbacks Listeners Promise 前言 coder都知道,javascript语言运行环境是单线程的,这意味着任何两行代码都不能同时运行.多任务同时进行时,实质上形 ...
- php异步调用方法实现示例
php 异步调用方法 客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果. 有时服务器需要执行很耗时的操作,这个操作的结果并不需要返回 ...
- Asynchronous MQTT client library for C (MQTT异步客户端C语言库-paho)
原文:http://www.eclipse.org/paho/files/mqttdoc/MQTTAsync/html/index.html MQTT异步客户端C语言库 用于C的异步 MQTT 客 ...
- Node.js的那些坑——如何让异步并发方法同步顺序执行(for循环+异步操作)
1 前言 nodejs的回调,有时候真的是让人又爱又恨的,当需要用for循环把数据依次存入数据库,但是如果使用正常的for循环,永远都是最后一次值的记录,根本不符合要求. 解决此方案有几种,例如闭包( ...
- 由使用request-promise-native想到的异步处理方法
由使用request-promise-native想到的异步处理方法 问题场景 因为js语言的特性,使用node开发程序的时候经常会遇到异步处理的问题.对于之前专长App开发的我来说,会纠结node中 ...
- 微信小程序:封装全局的promise异步调用方法
微信小程序:封装全局的promise异步调用方法 一:封装 function POST(url, params) { let promise = new Promise(function (resol ...
- [译]C# 7系列,Part 2: Async Main 异步Main方法
原文:https://blogs.msdn.microsoft.com/mazhou/2017/05/30/c-7-series-part-2-async-main/ 你大概知道,C#语言可以构建两种 ...
- axios浏览器异步请求方法封装 XMLHttpRequest
axios学习笔记defaults(浏览器端异步请求处理方式) 浏览器异步请求方法封装,主要使用XMLHttpRequest lib/adapters/xhr.js //入口 var utils = ...
随机推荐
- free 或delete后指针怎么样了
free()和delete()只是把指针所指向的内存释放掉,但是并没有把指针本身删除,也没有把指针置为NULL; #include<iostream> using namespace st ...
- Cookie操作类、压缩、序列化
1.cookie类 CartCookie.cs using System; using System.Data; using System.Configuration; using System.We ...
- .net core 环境安装失败,错误:0x80072EE2
安装[DotNetCore.1.0.1-VS2015Tools.Preview2.0.3.exe]失败,提示这个界面 查看log发现,发现猫腻,然后copy下链接,用迅雷手动下载[AspNetCore ...
- JustMock .NET单元测试利器(一)
1.什么是Mock? Mock一词是指模仿或者效仿,用于创建实例和静态模拟.安排和验证行为.在软件开发中提及"mock",通常理解为模拟对象.模拟对象的概念就是我们想要创建一个可以 ...
- 如果没有Build path怎么办 .project文件的修改
<?xml version="1.0" encoding="UTF-8"?><projectDescription> <name& ...
- Windows环境下使用python 3.x自带的CGI服务器测试cgi脚本--Python
1.在桌面上新建一个文件夹作为服务器目录文件夹(文件夹名称自定义,文件夹位置自定义),在www文件下再建一个文件夹,文件夹名为“cgi-bin”,须是这个文件名,其他试过不行(原因暂时未知)
- tomcat查看端口被占用
1. tomcat有安装版和压缩版 安装版的没有关闭命令 压缩版的命令如下: tomcat关闭:catalina stop/shutdown 开启:catalina start 2. 在tomca ...
- JavaScript之中级教程关键
Date() setTime()getTime()toUpperCase() toLowerCase() charAt() 返回指定的字符,返回的字符长度为1的字符串. indexOf('需要检索的字 ...
- [Luogu4174][NOI2006]最大获益
luogu sol 一周没摸键盘了回来刷刷水题练练手感 显然,最大化收益可以转化为最小化损失,从而建立最小割模型. 记\(tot=\sum_{i=1}^{m}C_i\),事先假设所有的获益都得到了,那 ...
- Marriage Match IV HDU - 3416
题意 给你n个点,m条边,要求每条边只能走一次的S到T的最短路径的个数 题解 在我又WA又TLE还RE时,yyb大佬告诉我说要跑两遍SPFA,还说我写的一遍SPFA是错的,然而 啪啪打脸... 而且他 ...