我实现了如下的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个周期随机)
你能建议我吗?答案 0 :(得分:2)
从不同的线程访问相同的Redis连接是不安全的。每个线程都应该有自己的连接(或使用连接池)。
在您的示例中,您有两个共享相同管道和连接的线程。