PythonでRedisサーバーを使用しています。
私のアプリケーションはマルチスレッド (プロセスごとに 20 ~ 32 のスレッドを使用) であり、別のマシンでアプリを実行しています。
Redis の CPU 使用率が 100% になり、Redis サーバーが応答しなくなったり遅くなったりすることがあります。
アプリケーションごとに合計 4 つの接続の 1 つの接続プールを使用したいと考えています。たとえば、最大 20 台のマシンでアプリを実行する場合、redis サーバーへの接続数は 20*4 = 80 になります。
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ステートメントがあることに気付きました。最終的には何の目的ですか?