Как разделить данные между экземплярами сервера на 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 шт):
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())