suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Python Redis Multi-Prozess-Nutzung

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

巴扎黑巴扎黑2730 Tage vor1118

Antworte allen(1)Ich werde antworten

  • typecho

    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
    

    Antwort
    0
  • StornierenAntwort