Python Flask 网站来自无尽的数据循环?

Python Flask website from endless data loop?

我以前使用 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 我想使用它。

虽然我之前建立的网站都是基于 request/reply 的基础网站。我到底要如何从一个连续的循环中创建一个 Flask 网站?

基本上,您需要的是某种形式的存储,两个进程可以同时访问。 如果你不想离开单个 python 可执行文件的舒适,你应该研究线程: https://docs.python.org/2/library/thread.html

否则,您可以编写两个不同的 python 脚本(一个用于传感器读数,一个用于烧瓶),让一个写入文件,下一个从文件中读取(或在 Linux,不知道 Windows 提供什么)和 运行 两个进程同时进行,让您的 OS 处理 "threading"。

第二种方法的优点是 OS 可以提高性能,但是您在锁定和读取文件方面失去了很多自由。如果你的服务器在你的传感器脚本写入的瞬间读取,可能会有一些奇怪的行为,但我做了类似的事情没有问题,我依稀记得 OS 应该在读取或写入时处理一致的文件状态到.

从用户的角度来看,网页只会对合理时间间隔内的最新值感兴趣...例如 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()