Flask. Потоки. Проблема с обменом данными

Необходимо реализовать следующий механизм: есть Flask сервер, который обрабатывает запрос от хоста:

@app.route("/get_data", methods=["GET"])
def get_data():
    data_out_2 = parent_conn.recv()
    return jsonify(data_out_2)

и есть отдельный скрипт, который работает с датчиком, постоянно его опрашивая и записывая данные. Запускаю его как отдельный поток:

parent_conn, child_conn = multiprocessing.Pipe()
thr = threading.Thread(target=sm_1.sm_1_worker, args=(spi_chanell, child_conn, f))
thr.start()

Задача в том, чтобы "выдергивать" данные для хоста. То есть хост присылает запрос на данные, Flask их отправляет, сервер тут как посредник, с одной стороны поток опроса датчика, с другой - ответ на запросы хоста

Пробовал решить задачу через Pipe. Данные присылаются, но не полностью, нет обновления, то есть датчик меняет своё состояние и даже при медленном опросе на хосте должно отобразиться изменение, а данные там крутятся старые. на стороне хоста вот так реализовал запрос var data_sm объявлена глобально, потом парсится

var data_sm = {"Temp_IS": 0,
                "Temp_server": 0}

setInterval(realTimeFeed, 100);  

function realTimeFeed(callback) {
    fetch('/get_data', {
        method: 'GET'})
        .then((response) => {
            return response.json();
            })
            .then((data) => {
            data_sm = data;
            });
};

function parse_temp(callback) {
    let data_temp_temp = {};
    data_temp_temp.plot0 = data_sm["Temp_IS"];
    data_temp_temp.plot1 = data_sm["Temp_server"];

    callback(JSON.stringify(data_temp_temp));
}

При такой реализации идут ошибки _pickle.UnpicklingError: invalid load key, '\x00'., а при реализации при помощи очередей - очередь растет быстрее, чем её опрашиваю. То есть я смотрю данные например номер 3, а там очередь уже 1250. то есть до новых данных нескоро дойду


Ответы (1 шт):

Автор решения: Mikhail

вопрос решен довольно просто. вероятно это костыль, но пока решение найдено такое: В классе Queue() модуля multiprocessing в Python есть метод empty(), который проверят пуста ли очередь, правда он не надежен из-за многопоточной/многопроцессорной семантики, но тут - подходит. Смотрим пуста ли очередь, если да - бросаем туда значение. Реализовать это надо в функции, которая опрашивает датчик

def sm_1_worker(q):
    if q.empty():
        q.put(data_out)

соответственно в Flask мы просто забираем значение

@app.route("/get_data", methods=["GET"])
def get_data():
    if not q.empty():
        return jsonify(q.get())
→ Ссылка