因为redis是单线程的,很多时候以为所有的操作都是原子性的,也就是一组事务里的操作要么全部执行,要么全部不执行,不存在中间状态。
今天出于好奇,测试了下多进程下数据的准确性,发现并不是那样的。 如下。
import time
import threading
import redis
class BaseThread(threading.Thread):
def __init__(self, thread_id, func, **kwargs):
threading.Thread.__init__(self)
self.threadID = thread_id
self.func = func
self.kwargs = kwargs
def run(self):
print("start:" + self.name)
self.func(**self.kwargs)
print("end:" + self.name)
def redis_atom():
"""
:return:
"""
redis_client = redis.Redis(host="127.0.0.1",
port=6379,
password="111111",
db=2,
decode_responses=True, )
_key = "demo3"
for x in range(1000):
a = int(redis_client.get(_key) or 0)
redis_client.set(_key, a + 1)
time.sleep(0.1)
def run():
"""
run
:return:
"""
# t = Tree()
#
# for x in range(10):
# t.add(x)
#
# t.view()
th = []
for x in range(3):
_thread_temp = BaseThread(x, redis_atom)
th.append(_thread_temp)
for x in th:
x.start()
for x in th:
x.join()
if __name__ == '__main__':
""" __main__ """
run()
以上是多线程写入redis , 没用incr. 结果是每次的数值都不相同。并非所有的操作都是原子性,逻辑上顺序的。
再次记录一下。本来是想看看分布式锁的实现,突然想起测试这个。