Python TCP-сервер Asyncio для MYSQL пула соединений - PullRequest
0 голосов
/ 08 мая 2020

У меня есть несколько процессов, работающих одновременно на сервере, которым необходимо выполнять запросы к базе данных mysql.

Я хотел бы создать TCP-сервер, к которому мои процессы будут подключаться и отправлять запросить запрос в виде объекта JSON и получить результат запроса (также как JSON).

В основном, я рассматриваю использование («совместное использование») пула соединений с базой данных между несколькими процессы для повышения производительности / уменьшения количества подключений к базе данных.

До сих пор я модифицировал пример asyncio «эхо-сервер», и теперь я могу отправлять / получать JSON полезных данных между моим клиентом и сервером.

Теперь я хотел бы настроить пул соединений на моем TCP-сервере и использовать его при поступлении запросов.

import asyncio
import json
import aiomysql

async def handle_request(reader, writer):

    data = b''
    while True:
        data += await reader.read(10)
        reader.feed_eof()
        if reader.at_eof():
            break

    message = data.decode()
    addr = writer.get_extra_info('peername')
    print(f"Received {message} from {addr}")

    order = json.loads(message)
    print(f"{order['database']}, {order['query']}")

    #<?  Execute query and retrieve result ?>

    result = {}
    result['success'] = 'yes'
    result['data'] = 'query result'
    response  = json.dumps(result)

    print(f"Sending: {response}")
    writer.write(response.encode())
    await writer.drain()

    print("Close the client socket")
    writer.close()

loop = asyncio.get_event_loop()
coro = asyncio.start_server(handle_request, '127.0.0.1', 8888, loop=loop)
server = loop.run_until_complete(coro)

# Serve requests until Ctrl+C is pressed
print('Serving on {}'.format(server.sockets[0].getsockname()))
try:
    loop.run_forever()
except KeyboardInterrupt:
    pass

# Close the server
server.close()
loop.run_until_complete(server.wait_closed())
loop.close()

Как мне правильно настроить пул соединений в этом контексте? Как мне вызвать выполнение запросов из handle_request? Я подумал, что aio mysql будет правильным модулем, но я не уверен, как его правильно использовать.

...