lock与rlock
使用lock不能连续两次获取锁,获取锁必须先释放锁。但是在一个线程中调用另一个函数时,在该函数中要继续操作共享的数据,这时获取锁就相当于连续执行两次获取锁,所以lock就不适用该场景,就要使用rlock了。
condition(条件变量,用于复杂的线程间同步)
场景:
期待天猫与小爱的对话如下
天猫:小爱同学
小爱:在
天猫:我们来对古诗吧
小爱:好啊
使用lock来实现
import threading
class XiaoAi(threading.Thread):
def __init__(self, lock):
super().__init__(name="小爱")
self.lock = lock
def run(self):
self.lock.acquire()
print("{} : 在 ".format(self.name))
self.lock.release()
self.lock.acquire()
print("{} : 好啊 ".format(self.name))
self.lock.release()
class TianMao(threading.Thread):
def __init__(self, lock):
super().__init__(name="天猫精灵")
self.lock = lock
def run(self):
self.lock.acquire()
print("{} : 小爱同学 ".format(self.name))
self.lock.release()
self.lock.acquire()
print("{} : 我们来对古诗吧 ".format(self.name))
self.lock.release()
if __name__ == '__main__':
lock = threading.Lock()
xiaoai = XiaoAi(lock)
tianmao = TianMao(lock)
tianmao.start()
xiaoai.start()
结果:
可见lock并没有按照我们预期的方向去执行,因为第一点tianmao在start之后,在没有执行到小爱的start之前,天猫可能就将run方法里面的逻辑执行完毕。第二点GIL释放的时候是根据字节码执行的行数或时间片进行切换的,可能在执行天猫这个线程时,天猫反复拿到锁与释放锁,还没切换到小爱这个线程