使用 webpy 流式传输连续数据
Use webpy to stream continuous data
我想使用 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
) 的应用程序,但它无法显示 "live" 数据(我假设这是因为 app.run()
出现在循环之前)
知道如何让这项工作成功吗?
首先,你是对的:你的 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
- 使用 Transfer-Encoding 'chunked' 告诉浏览器并非所有数据都同时到达。
- 仅产生新值(您的示例连接了字符串)。
- 因为您使用
yield
,在 GET() 中,该 GET 返回的所有数据都必须使用 yield
(因此是我的 yield 'Here we go!'
示例。)
它工作正常,但您的浏览器会缓冲结果:它确实会以一秒的间隔接收数据 "forever",但浏览器不会在每次接收时更新。 Chrome,例如,似乎要等到它收到最初的 1k 数据。然后它首先写入浏览器,然后将在 每个 新接收上更新 window(因此它只缓冲第一位)。
所以,请尝试更新后的代码并等待。
我想使用 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
) 的应用程序,但它无法显示 "live" 数据(我假设这是因为 app.run()
出现在循环之前)
知道如何让这项工作成功吗?
首先,你是对的:你的 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
- 使用 Transfer-Encoding 'chunked' 告诉浏览器并非所有数据都同时到达。
- 仅产生新值(您的示例连接了字符串)。
- 因为您使用
yield
,在 GET() 中,该 GET 返回的所有数据都必须使用yield
(因此是我的yield 'Here we go!'
示例。)
它工作正常,但您的浏览器会缓冲结果:它确实会以一秒的间隔接收数据 "forever",但浏览器不会在每次接收时更新。 Chrome,例如,似乎要等到它收到最初的 1k 数据。然后它首先写入浏览器,然后将在 每个 新接收上更新 window(因此它只缓冲第一位)。
所以,请尝试更新后的代码并等待。