我有多个MQTT节点,其中配置了不同的主题。现在我将处理多个主题的价值并找出一些假设(基本上是流分析)。
我的期望:
我知道java脚本是单线程的。所以我认为,当收到一个主题数据时,它将被处理,然后只有在完成后才会收到其他主题,等等。
现实:
它像多线程一样工作。
测试案例
流程: MQTT --->处理第二个--->输出
睡眠功能代码(不是真的像处理一样睡觉):
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++)
{
if ((new Date().getTime() - start) > 1000)
{
break;
}
}
return msg;
现在我将使用for循环连续发布1到100的数据。
我的期望:
现在1,2,3 ...... 100将一个接一个地显示1秒的间隙。所以现在它应该花费大约100秒来显示1到100的值。
现实:
首先它将睡眠100秒然后形成1到100全部将立即显示。 那么这里发生了什么?
流json:
[{"id":"e9a53835.09af38","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"5ffb1b40.1405b4","type":"debug","z":"e9a53835.09af38","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":438,"y":216,"wires":[]},{"id":"a8406277.a78ee","type":"mqtt in","z":"e9a53835.09af38","name":"Test MQTT Queue","topic":"1","qos":"2","broker":"b4c58fab.26844","x":146,"y":120,"wires":[["629e90bb.996ad"]]},{"id":"629e90bb.996ad","type":"function","z":"e9a53835.09af38","name":"Sleep 1 seconds","func":"var start = new Date().getTime();\nfor (var i = 0; i < 1e7; i++)\n{\n if ((new Date().getTime() - start) > 1000)\n {\n break;\n }\n}\nreturn msg;","outputs":1,"noerr":0,"x":298,"y":168,"wires":[["5ffb1b40.1405b4"]]},{"id":"b4c58fab.26844","type":"mqtt-broker","z":"","name":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"2","willRetain":"false","willPayload":"","birthTopic":"","birthQos":"2","birthRetain":"false","birthPayload":""}]
C#发布商功能:
// Retain: false, QOS= 2 on both publisher and client.
for (int i = 1; i <= 10; i++)
{
client.Publish(1, Encoding.UTF8.GetBytes(i.ToString()), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
}
答案 0 :(得分:2)
这里的关键是在node.js世界中同步阻塞是一件坏事。如果要延迟消息,请使用延迟节点,使用计时器这样做 - 从而允许node.js继续在后台处理其他工作。