我想使用python
和web.py
将连续传感器数据流式传输到小型网络套接字。但我无法更新数据。
最小工作示例如下所示:
#!/usr/bin/env python
import web
from time import sleep
# 1. Data part, create some csv-string
streamString = "x,y\n"
streamString = streamString + "123,123\n"
# 2. webpy part, create a minimum server
urls = ('/', 'index')
class index:
def GET(self):
return streamString
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
# simulate some sensor data that is read continuously
i = 0
while True:
newString = "{0},{1}\n".format(i, i+1)
i = i + 2
streamString = streamString + newString
sleep(1)
这会创建显示第一个条目(x,y\n123,123\n
)的应用,但它无法显示“实时” - 数据(我假设这是app.run()
在循环之前)
知道如何让这项工作成功吗?
答案 0 :(得分:1)
首先,你是对的:你的while True:
永远不会被执行,因为它位于app.run()
之后。
基本策略是使用yield
使GET()成为生成器,而不是返回字符串。例如:
class index:
def GET(self):
web.header('Transfer-Encoding', 'chunked')
yield "Here we go!"
i = 0
while True:
newString = "{0},{1}\n".format(i, i+1)
i = i + 2
sleep(1)
yield newString
yield
,因此在GET()中,该GET返回的所有数据都必须使用yield
(因此我的yield 'Here we go!'
示例。)它工作正常,但您的浏览器将缓冲结果:它确实会“永远”地间隔一秒钟接收数据,但浏览器不会在每次接收时更新。例如,Chrome似乎要等到收到最初的1k数据。然后它首先写入浏览器&然后将更新每个新接收的窗口(因此它只缓冲第一位)。
因此,请尝试更新的代码并等待。