使用webpy流式传输连续数据

时间:2017-01-02 04:45:49

标签: python web.py

我想使用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)的应用,但它无法显示“实时” - 数据(我假设这是app.run()在循环之前)

知道如何让这项工作成功吗?

1 个答案:

答案 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
  1. 使用Transfer-Encoding'chunked'告诉浏览器不是所有数据都会立即出现。
  2. Yield 新值(您的示例连接字符串)。
  3. 由于您使用yield,因此在GET()中,该GET返回的所有数据都必须使用yield(因此我的yield 'Here we go!'示例。)
  4. 它工作正常,但您的浏览器将缓冲结果:它确实会“永远”地间隔一秒钟接收数据,但浏览器不会在每次接收时更新。例如,Chrome似乎要等到收到最初的1k数据。然后它首先写入浏览器&然后将更新每个新接收的窗口(因此它只缓冲第一位)。

    因此,请尝试更新的代码并等待。

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