Как разделить данные между экземплярами сервера на asyncio?

Доброго времени и хорошего настроения! Учу Python3 на курсе и столкнулся с вопросом. Прошу совета!

Есть сервер:

import asyncio

class ClientServerportocol(asyncio.Protocol):
    DATA = {}

    def connection_made(self, transport):
        self.transport = transport
        self.ip = transport.get_extra_info('peername')
        print('connect from:', self.ip)

    #Форматируем данные по типу
    def recompl(self, data):
       *****
    #Получение запросов и обработка
    def data_received(self, data: bytes):
       *****
    #запись данных на сервер
    def put(self, requests):
       *****
    #получение данных c сервера
    def get(self, requests):
       *****
#запуск сервера
def run_server(host='', port=9001):
    loop = asyncio.get_event_loop()
    coro = loop.create_server(ClientServerportocol, host, port)
    server = loop.run_until_complete(coro)
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        print("Server stoped with,", "KeyboardInterrupt".upper())
    server.close()
    loop.run_until_complete(server.wait_closed())
    loop.close()

Нужно разделить данные между его экземплярами. Тема с asyncio оказалась для меня слишком тугой. Почитав таки понял что и с чем едят. Но вот только уперся в другое. Как отделить данные. между разными экземплярами серверов на asyncio.

Использовать переменную класса не получится, так как она общая для всех экземпляров. Использовать переменную экземпляра класса это уткнуться в короткий срок её жизни в рамках одного подключения. пробовал использовать совет с Хабра с использованием класса. Но... уперся в туже проблему... с не пониманием, как реализовать создание отдельного хранилища для экземпляра сервера... Пытался изобразить вот такое безобразие:

class Data_base:
    data = {}

    def __init__(self):
        Data_base.data = {}


class ClientServerportocol(asyncio.Protocol):
    data = Data_base

    def __init__(self):
        print(type(self.data))
        self.data = Data_base.data

И тут встаёт вопрос как это реализовать?


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

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

https://docs.python.org/3/library/asyncio-protocol.html#tcp-echo-client

Вот посмотри как строка хелловорд в сервер передается.

import asyncio


class EchoServerProtocol(asyncio.Protocol):

    def __init__(self, database):
        self.db = database

    def connection_made(self, transport):
        peername = transport.get_extra_info('peername')
        print('Connection from {}'.format(peername))
        self.transport = transport

    def data_received(self, data):
        message = data.decode()
        print('Data received: {!r}'.format(message))

        print('Send: {!r}'.format(message))
        self.transport.write(data)

        print('Close the client socket')
        self.transport.close()


async def main():
    # Get a reference to the event loop as we plan to use
    # low-level APIs.
    loop = asyncio.get_running_loop()
    database = {} 
    server = await loop.create_server(
        lambda: EchoServerProtocol(database ),
        '127.0.0.1', 8888)

    async with server:
        await server.serve_forever()


asyncio.run(main())
→ Ссылка