2017-04-02 76 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提供了什么),并且同时运行这两个进程并让你的操作系统处理“线程”。

第二种方法的优点是操作系统关注性能,但是在锁定和读取文件方面存在很大的自由。如果你的服务器在你的传感器脚本写入的时候读取,可能会有一些奇怪的行为,但是我做了类似的事情没有问题,并且我不明白一个操作系统应该在读取或写入时处理一致的文件状态。