使用 webpy 流式传输连续数据

Use webpy to stream continuous data

我想使用 pythonweb.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
  1. 使用 Transfer-Encoding 'chunked' 告诉浏览器并非所有数据都同时到达。
  2. 产生新值(您的示例连接了字符串)。
  3. 因为您使用 yield,在 GET() 中,该 GET 返回的所有数据都必须使用 yield(因此是我的 yield 'Here we go!' 示例。)

它工作正常,但您的浏览器会缓冲结果:它确实会以一秒的间隔接收数据 "forever",但浏览器不会在每次接收时更新。 Chrome,例如,似乎要等到它收到最初的 1k 数据。然后它首先写入浏览器,然后将在 每个 新接收上更新 window(因此它只缓冲第一位)。

所以,请尝试更新后的代码并等待。

另见 http://webpy.org/cookbook/streaming_large_files