我正在使用带有 python 的 Redis 服务器。
我的应用程序是多线程的(我每个进程使用 20 - 32 个线程),而且我还在不同的机器上运行该应用程序。
我注意到有时 Redis cpu 使用率为 100% 并且 Redis 服务器变得无响应/缓慢。
我想为每个应用程序使用 1 个总共 4 个连接的连接池。例如,如果我最多在 20 台机器上运行我的应用程序,则应该有 20*4 = 80 个到 redis 服务器的连接。
POOL = redis.ConnectionPool(max_connections=4, host='192.168.1.1', db=1, port=6379)
R_SERVER = redis.Redis(connection_pool=POOL)
class Worker(Thread):
def __init__(self):
self.start()
def run(self):
while True:
key = R_SERVER.randomkey()
if not key: break
value = R_SERVER.get(key)
def _do_something(self, value):
# do something with value
pass
if __name__ = '__main__':
num_threads = 20
workers = [Worker() for _ in range(num_threads)]
for w in workers:
w.join()
当执行命令时,上面的代码应该运行从最大大小为 4 的连接池中获取连接的 20 个线程。
什么时候释放连接?
根据此代码(https://github.com/andymccurdy/redis-py/blob/master/redis/client.py):
#### COMMAND EXECUTION AND PROTOCOL PARSING ####
def execute_command(self, *args, **options):
"Execute a command and return a parsed response"
pool = self.connection_pool
command_name = args[0]
connection = pool.get_connection(command_name, **options)
try:
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
except ConnectionError:
connection.disconnect()
connection.send_command(*args)
return self.parse_response(connection, command_name, **options)
finally:
pool.release(connection)
每条命令执行完毕后,连接被释放并回到池中
有人可以验证我是否正确理解了这个想法并且上面的示例代码将按描述工作吗?
因为当我看到redis连接时,总是有4个以上。
编辑:我刚刚在代码中注意到该函数在 finally 之前有一个 return 语句。那么finally的目的是什么?