适用于MYSQL连接池的Python Asyncio TCP服务器

时间:2020-05-08 14:48:38

标签: json python-asyncio tcpserver aio-mysql

我有一堆同时在服务器上运行的进程,需要对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的查询?我以为aiomysql是正确的模块,但是我不确定如何正确使用它。

0 个答案:

没有答案