我之前使用Flask构建了一些网站,包括使用websockets的网站,但这次我不确定如何开始。
我目前在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网站呢?
答案 0 :(得分: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()
答案 1 :(得分:0)
基本上,您需要的是两个进程可以同时访问的某种形式的存储。 如果你不想放弃一个python可执行文件,你应该考虑线程: https://docs.python.org/2/library/thread.html
否则,您可以编写两个不同的python脚本(一个用于传感器读数,一个用于烧瓶),让一个写入文件,下一个读取它(或在Linux中使用管道,不知道Windows提供什么),并同时运行两个进程,让你的操作系统处理"线程"。
第二种方法的优点是操作系统可以处理性能,但是在锁定和读取文件时会失去很多自由。如果您的服务器在您的传感器脚本写入的瞬间读取,可能会有一些奇怪的行为,但我做了类似的事情没有问题,我朦胧地回忆起操作系统应该在读或写时处理一致的文件状态到。