Heim > Fragen und Antworten > Hauptteil
class RedisClient(object):
def __init__(self):
pool = redis.ConnectionPool(host='127.0.0.1', port=6379)
self.client = redis.StrictRedis(connection_pool=pool)
Schreiben Sie einen Redis-Client mit einem Verbindungspool gemäß der Dokumentation und generieren Sie dann eine Instanz für die globale Verwendung.
Es wurde getestet, dass es normal ist, wenn eine Instanz in mehreren Threads geteilt wird.
Aber bei mehreren Prozessen ist der Test fehlgeschlagen
class ProcessRdeisTest(Process):
def __init__(self,client):
self._client = client
So geschrieben: Beim Ausführen von Start wird ein Fehler gemeldet und die Serialisierung kann nicht durchgeführt werden.
geändert zu:
class ProcessRdeisTest(Process):
def __init__(self):
pass
def run(self):
self._client = RedisClient()
while Ture:
dosomething()
Es funktioniert so, aber ist diese Verbindungsmethode richtig? Gibt es einen besseren Weg, dies zu erreichen?
Im Hauptthread direkt
process1 = ProcessRdeisTest('p1')
process1.start()
Auf diese Weise aufrufen
typecho2017-06-08 11:04:09
楼主,python redis有自己的连接池:
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