2017-01-02 1 views
1

pythonweb.py을 사용하여 연속적인 센서 데이터를 작은 웹 소켓으로 스트리밍하고 싶습니다. 하지만 데이터를 업데이트하지 못했습니다.webpy를 사용하여 연속 데이터를 스트리밍

는 최소 동작하는 예제는 다음과 같다 : 이것은 첫 번째 항목 (x,y\n123,123\n)를 표시하는 응용 프로그램을 작성하는

#!/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) 

하지만 - 데이터를 "라이브"쇼에 실패 (나는이 app.run()로 가정 루프 앞에오다.)

내가 어떻게이 일을 할 수 있는지 알기 원한다.

답변

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. 를 사용하여 전송 인코딩 모든 데이터를 한 번에오고 브라우저에게 '청크'.
  2. 수익률 새 값 (예제는 문자열을 연결).
  3. 당신이 yield 사용해야합니다)를 GET (에, 그 GET에 의해 반환 된 모든 데이터를 yield를 사용하기 때문에

그것은 잘 작동하지만 당신의 브라우저는 결과를 버퍼됩니다 (따라서 내 yield 'Here we go!' 예.) : 그것은 참 것이다 데이터를 1 초 간격으로 "영원히"수신하지만 각 수신시 브라우저가 갱신되지 않습니다. 예를 들어 Chrome은 초기 1k 데이터가 수신 될 때까지 기다리는 것으로 보입니다. 그런 다음 브라우저에 처음으로 쓰기를 수행합니다. & 다음에 각각 의 창을 업데이트합니다. 새 수신 (따라서 첫 번째 비트 만 버퍼링합니다).

그래서 업데이트 된 코드를 시도하고 기다리십시오.

도 참조 http://webpy.org/cookbook/streaming_large_files

관련 문제