祝您一切顺利,感谢您的阅读。
一直在重新审视一个旧项目,利用plotly将数据从mysql中流出来,并在两者之间使用python。我从来没有在plot.ly上有过好运气(我确信这更多地与我的理解有关,而不是他们的平台),流/iframes似乎随着时间的推移而停滞不前,我不太容易完全排除故障。
我当前的症状是这样的:绘图任意停止 - 我正在推送数据,但 iframe 没有更新。
当前的解决方案是:每X分钟刷新一次浏览器。
该解决方案有效,但令人烦恼,因为我不明白为什么视觉效果首先会停滞(是我,是他们,等等)。
当我查看一些文档时,特别是这个链接: https://plot.ly/streaming/
我注意到他们呼吁不要不断地打开和关闭流,并且应该经常放置心跳以保持事物的活力/新鲜。
这是我目前每 10 分钟调用一次的电话:
pullData(mysql)
format data
open(plotly.stream1)
write data to plotly.stream1
close(plotly.stream1)
open(plotly.stream2)
write data to plotly.stream2
close(plotly.stream2)
根据我正在阅读的内容,听起来我实际上应该在启动时执行一次脚本,并保持流打开,但在实际的 write() 调用之间每 15 秒左右对它们进行 heartbeat() 一次,如下所示:
open(plotly.stream1)
open(plotly.stream2)
every 10 minutes:
pullData(mysql)
format data
write data to plotly.stream1
write data to plotly.stream2
while not pulling and writing:
every 15 seconds:
heartbeat(plotly.stream1)
heartbeat(plotly.stream2)
if error:
close(plotly.stream1)
close(plotly.stream2)
请原谅 sudo 困惑,我只是想传达一个想法。有人有什么建议吗?我基于流媒体示例开始了我原来的打开、编写、关闭的路径,但这是一次性编写的。另一个例子是持续的数据流。我介于两者之间。
此外 - 这个思路是否与 iframe 不刷新有关?我的一部分认为这种症状与我的想法无关 - 数据变得很好 - 这是我的 session 即将过期,或者 iframe“连接”即将过时。如果症状无关,至少我会让我的源代码更干净、更合适。
非常感谢任何建议!
谢谢 -贾斯汀
最佳答案
Plotly 将关闭超过 60 秒不活动的流。您必须向流媒体 channel 发送换行符(心跳)以使其保持打开状态。我建议每 30 秒一次。
您的第一个代码示例可能无法按预期工作,因为当您的第一个源流(将脚本连接到我们的系统的流)退出时,客户端 Websocket(将绘图连接到我们的系统)可能会关闭。当您断开源流时,系统会向我们的系统发送一个信号,让系统知道您的流现在处于非事件状态。如果新的源流没有快速重新连接,我们将关闭连接 Websocket 的客户端。
现在,当您的脚本获取更多数据并打开新流时,它将成功地将数据流式传输到我们的系统,但客户端 Websocket(现已关闭)不会将数据传递到 Plot。我们会在后台为您缓存一定数量的点,以便当您刷新页面时,Websocket 会重新连接,并且您可以获得最后的 n 个点(其中 n 由 API 调用中的 max-points 设置)。
这就是发送心跳如此重要的原因。我们保持源流打开,这反过来又确保所有连接的客户端保持其 websockets 打开。
这不一定是流媒体平台最强大的行为,我们将来可能会做得更好。但现在,通过尝试实现第二个示例中的代码,您可能会看到更好的结果。
希望有帮助!
关于Python - Plot.ly - MySQL 实时流可视化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446675/