SETNX key value
只有在 key 不存在时设置 key 的值。存在的话,在执行后,返回结果是0;不存在值,进行设置的话,返回结果是1。
先用python实现两个线程交替运行
import time
from threading import Thread
def task1():
while True:
print("this is task1")
time.sleep(1)
def task2():
while True:
print("this is task2")
time.sleep(1)
t1 = Thread(target=task1)
t2 = Thread(target=task2)
t1.start()
t2.start()
运行结果如下:
现在用上多线程的互斥锁
import time
from threading import Thread, Lock
i = 5
def task1():
while True:
global i
i += 1
if i % 3 == 0:
print("this is task1", i)
lock2.acquire()
lock1.release()
time.sleep(1)
def task2():
while True:
global i
i += 1
if i % 5 == 0:
print("this is task2", i)
lock1.acquire()
lock2.release()
time.sleep(1)
lock1 = Lock()
lock2 = Lock()
t1 = Thread(target=task1)
t2 = Thread(target=task2)
lock1.acquire()
t1.start()
t2.start()
使用redis的setnx,可以实现分布式锁的功能
import redis
import time
from threading import Thread, Lock
i = 5
res = redis.Redis(host='localhost', port=6379, db=9)
def task1():
while True:
global i
i += 1
res.delete("lock")
if i % 3 == 0:
if res.setnx("lock", "11"):
print("this is task1", i)
time.sleep(1)
def task2():
while True:
global i
i += 1
res.delete("lock")
if i % 3 == 0:
if res.setnx("lock", "11"):
print("this is task2", i)
time.sleep(1)
t1 = Thread(target=task1)
t2 = Thread(target=task2)
res.setnx("lock", "22")
t1.start()
t2.start()