Python Redis Multi-Prozess-Nutzung
巴扎黑
巴扎黑 2017-06-08 11:02:09
0
1
1137
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

巴扎黑
巴扎黑

Antworte allen(1)
typecho

楼主,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
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage