何时redis管道exceute()方法被阻止?

时间:2015-12-28 11:56:14

标签: python redis

我实现了如下的Redis包装器类。

import redis
import threading
import time

class IntervalRedis(object):
    @classmethod
    def init(cls, interval=0.1, host='localhost', port=6379, db=0):
        cls._r = redis.Redis(host=host, port=port, db=db)
        cls.r = cls._r.pipeline()
        cls.t = threading.Thread(target=cls._intervalExecute)
        cls.interval = interval

        cls.t.start()  


    @classmethod
    def _intervalExecute(cls):

        while True:
            print "1"
            cls.r.execute()     # blocked at here after some loop cycle.
            print "2"
            time.sleep(cls.interval)
            print "3"

if __name__ == "__main__":
    print "start"
    IntervalRedis.init()
    count = 0

    while True:
        count+=1
        IntervalRedis.r.lpush("foo", count)
        time.sleep(0.01)
        if count == 10000000:
            break;

    print "end"

在主语句中,它访问redis pipline object并运行lpush命令,循环while语句。

但命令的实际执行是_intervalExecute定期与pipline execute()一起运行。

我认为它必须在count达到10000000时运行。

但是,当我运行此代码时,它会在一些循环周期后被阻止。 (有时3个周期,有时5个周期随机)

你能建议我吗?

1 个答案:

答案 0 :(得分:2)

从不同的线程访问相同的Redis连接是不安全的。每个线程都应该有自己的连接(或使用连接池)。

在您的示例中,您有两个共享相同管道和连接的线程。