2017-04-02 78 views
1

我已經使用Flask構建了一些網站,其中包括一個使用websockets的網站,但這次我不確定如何開始。從無盡的數據循環的Python燒瓶網站?

我目前在Python中有一個無限循環,它從ZeroMQ套接字獲取傳感器數據。它大致是這樣的:

import zeromq 
socket = zeromq.create_socket() 
while True: 
    data_dict = socket.receive_json() 
    print data_dict # {'temperature': 34.6, 'speed': 12.8, etc.} 

我現在要創造出一些漂亮的圖表,實時傳入的傳感器數據的儀表板。由於它在Python中,我很熟悉Flask和websockets,所以我想使用它。

我之前建立的網站是基本的請求/回覆的網站。我如何從連續循環創建一個Flask網站?

回答

1

從用戶的角度來看,網頁只會在合理的時間間隔內感興趣的最新值,例如3秒,因此您可以使用單獨的線程在後臺檢索值。

這是如何使用threading模塊在後臺更新最新值一個例子:

import threading 
import random 
import time 

_last_value = None 

def get_last_value(): 
    return _last_value 

def retrieve_value(): 
    global _last_value 
    while True: 
     _last_value = random.randint(1, 100) 
     time.sleep(3) 


threading.Thread(target=retrieve_value, daemon=True).start() 

for i in range(20): 
    print(i, get_last_value()) 
    time.sleep(1) 

在你的情況,這將是這樣的:

import threading 
import zeromq 

_socket = zeromq.create_socket() 
_last_data_dict = {} 

def get_latest_data(): 
    return _last_data_dict 

def retrieve_value(): 
    global _last_data_dict 
    while True: 
     _last_data_dict = _socket.receive_json() 

threading.Thread(target=retrieve_value, daemon=True).start() 
0

基本上,你需要的是某種形式的存儲,兩個進程可以同時訪問。 如果你不想留下一個Python可執行的舒適感,你應該看看線程: https://docs.python.org/2/library/thread.html

否則,你可以寫兩個不同的Python腳本(一個用於傳感器讀出,一個瓶),讓一個人寫入一個文件,另一個讀入文件(或者在Linux中使用管道,不知道Windows提供了什麼),並且同時運行這兩個進程並讓你的操作系統處理「線程」。

第二種方法的優點是操作系統關注性能,但是在鎖定和讀取文件方面存在很大的自由。如果你的服務器在你的傳感器腳本寫入的時候讀取,可能會有一些奇怪的行爲,但是我做了類似的事情沒有問題,並且我不明白一個操作系統應該在讀取或寫入時處理一致的文件狀態。