Rumah  >  Soal Jawab  >  teks badan

python redis penggunaan pelbagai proses

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

巴扎黑巴扎黑2714 hari yang lalu1104

membalas semua(1)saya akan balas

  • typecho

    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
    

    balas
    0
  • Batalbalas