Rumah > Soal Jawab > teks badan
class RedisClient(object):
def __init__(self):
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
self.client = redis.StrictRedis(connection_pool=pool)
Tulis klien redis dengan kumpulan sambungan mengikut dokumentasi, dan kemudian jana tika untuk kegunaan global.
Ia telah diuji untuk menjadi normal apabila berkongsi kejadian dalam berbilang rangkaian.
Tetapi dalam kes pelbagai proses, ujian gagal
class ProcessRdeisTest(Process):
def __init__(self,client):
self._client = client
Ditulis seperti ini, apabila melaksanakan permulaan, ralat akan dilaporkan dan siri tidak dapat dilakukan.
ditukar kepada:
class ProcessRdeisTest(Process):
def __init__(self):
pass
def run(self):
self._client = RedisClient()
while Ture:
dosomething()
Ia berfungsi seperti ini, tetapi adakah kaedah sambungan ini betul? Adakah terdapat cara yang lebih baik untuk mencapai ini?
Dalam utas utama, terus
process1 = ProcessRdeisTest('p1')
process1.start()
Panggil dengan cara ini
typecho2017-06-08 11:04:09
Pemilik, python redis mempunyai kolam sambungannya sendiri:
import redis
import threading
class RedisPool(object):
__mutex = threading.Lock()
__remote = {}
def __new__(cls, host, passwd, port, db):
with RedisPool.__mutex:
redis_key = "%s:%s:%s" % (host, port, db)
redis_obj = RedisPool.__remote.get(redis_key)
if redis_obj is None:
redis_obj = RedisPool.__remote[redis_key] = RedisPool.new_redis_pool(host, passwd, port, db)
return redis.Redis(connection_pool=redis_obj)
def __init__(self, host, passwd, port, db):
pass
@staticmethod
def new_redis_pool(host, passwd, port, db):
redis_obj = redis.ConnectionPool(host=host, password=passwd,
port=port, db=db, socket_timeout=3, max_connections=10) # max_connection default 2**31
return redis_obj