2017-01-02 5 views
1

Ich möchte kontinuierliche Sensordaten in einen kleinen Web-Socket unter Verwendung von python und web.py streamen. Aber ich kann die Daten nicht aktualisieren.Verwenden Sie webpy, um fortlaufende Daten zu streamen.

ein Mindestarbeitsbeispiel sieht wie folgt aus:

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

dies die App erstellt, die den ersten Eintrag zeigt (x,y\n123,123\n), aber es funktioniert nicht die „Live“ -Daten zeigen (ich nehme an, dies ist als app.run() kommt vor der Schleife)

Irgendeine Idee, wie ich das schaffen kann?

Antwort

1

Zunächst haben Sie Recht: Ihre while True: wird nie ausgeführt, weil es nach der app.run() ist.

Die grundlegende Strategie besteht darin, GET() zu einem Generator zu machen, der yield verwendet, anstatt eine Zeichenfolge zurückzugeben. Zum Beispiel:

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. Verwenden Transfer-Encoding ‚gestückelt‘ um den Browser zu sagen, nicht alle Daten auf einmal kommt.
  2. Ergebnis nur die neuen Werte (Ihr Beispiel verkettet die Zeichenfolgen).
  3. Weil Sie yield verwenden, in der GET(), um alle von diesen GET zurückgegebenen Daten müssen yield verwenden

Es funktioniert gut, aber Ihr Browser wird die Ergebnisse Puffer (daher mein yield 'Here we go!' Beispiel.): Es wird in der Tat Empfangen der Daten in Intervallen von einer Sekunde "für immer", aber der Browser aktualisiert sich nicht bei jedem Empfang. Chrome scheint zum Beispiel zu warten, bis es eine erste 1k Daten erhalten hat. Dann macht es das erste Schreiben in den Browser & dann wird das Fenster auf jeweils neuen Empfang aktualisieren (so puffert nur das erste Bit).

Also, versuchen Sie den aktualisierten Code und warten.

Siehe auch http://webpy.org/cookbook/streaming_large_files

Verwandte Themen