Как я могу обслуживать сохраненные данные из веб-сокетов, используя Flask? - PullRequest
1 голос
/ 16 июня 2020

TL; DR; Я пытаюсь запустить клиент, который извлекает данные из URI веб-сокетов, а затем использую Flask для обслуживания извлеченных данных из сокетов.

Мой предполагаемый рабочий процесс выглядит так: чтение данных из веб-сокетов (asyn c) -> запись данных в Python dict (постоянно) -> чтение данных из Python dict с использованием запросов GET на Flask (постоянно)

Проблема, с которой я столкнулся, заключается в том, что я использую словарь Python для хранения, но когда я читаю этот словарь из Flask, он не показывает мне обновленные значения.

Я создал иллюстрацию с кодом для моей проблемы

Клиент:

import asyncio
import websockets
import json

SOME_URI = "ws://localhost:8080/foo"
connections = set()
connections.add(SOME_URI)


class Storage:
    storage = dict() # local storage dict for simplicity

    @staticmethod
    def store(data): # here I store the value
        a, b, c = data
        Storage.storage[a] = c

    @staticmethod
    def show(): # Here I just show the value to be used in the GET
        return Storage.storage


async def consumer_handler(uri):
    async with websockets.connect(uri) as websocket:
        async for message in websocket:
            await consumer(message)


async def consumer(message):
    line = json.loads(message)
    Storage.store(line) # adds message to dict


async def main():
    await asyncio.wait([consumer_handler(uri) for uri in connections])


if __name__ == "__main__":
    asyncio.run(main())

Приложение:

from flask import Flask
from client import Storage

app = Flask(__name__)
app.debug = True


@app.route('/bar', methods=['GET'])
def get_instruments():
    res = Storage.show() # I expected here to see updated value for the dict as it fills up from websockets
    return res, 200


if __name__ == "__main__":
    app.run()

Каждый раз, когда я пытаюсь сделать GET запрос к странице Flask, я получаю значение пустого dict (не отражает изменения, которые я добавляю из веб-сокета). Я ожидал получать обновленное значение dict с каждым запросом GET.

1 Ответ

1 голос
/ 17 июня 2020

Проблема в том, что здесь задействованы два отдельных Python процесса: один - это asyn c скрипт для приема данных, а другой - flask. Поскольку это отдельные процессы, обновления dict, которые вы делаете в первом процессе, не видны второму процессу.

Здесь вам понадобится какая-то форма IP C (межпроцессного взаимодействия) для переносимости и / или сохранения данных. Один из очевидных и простых вариантов - использовать именованный FIFO или простой файл. В зависимости от уровня сложности, с которым вы хотите справиться, использование Redis (или подобного) также является другим вариантом.

...