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 шт):
вопрос решен довольно просто. вероятно это костыль, но пока решение найдено такое: В классе 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())