线程中 有四个概念比较重要,
阻塞, 非阻塞, 同步 ,异步
阻塞: 就是只有当阻塞的程序运行完了,你才能结束,它不完成你就一定要等待 直到结束后,你再结束,前面我们介绍的线程或者 进程的 join() , 他们也是等待 子线程或者 子进程完成之后 才能结束。
非阻塞: 他们的线程或者进程之间没有关系, 根本没有线程或者主进程 等待之说,也有可能主线程结束了,你也没有结束,直接中断子线程的运行。
同步: 举个例子,中国的老太太跳广场舞,广场的一百人他们的舞姿是一样,跟着歌曲变换步伐 ,他们一直听着歌曲的指令进行舞动。 同步就是按照预设的指令进行运行,一切的结果在自己的掌控之中。
异步: 和同步相反,根本不知道下一秒发生什么,不在自己中控之中,下一节我写异步。
今天的重点 就是用代码演示同步思想
异步
请观察下 代码, 感受下他们配合的默契。
from threading import Thread,Lock
import time
class Mythread1(Thread):
def run(self):
while True: # 轮询方式
if lock1.acquire(): # 第一次运行的时候,一定是可以上锁的,可以继续运行下边的代码块 (1) |||| 再次来到这里 锁1 没有释放需要等待(3)
print("我是lock1")
time.sleep(1)
lock2.release() # 开始释放 锁二 (2),
class Mythread2(Thread):
def run(self):
while True:
if lock2.acquire(): # 他已经上过锁了,所以这里要等待 锁二释放,(1) ||||| 锁二已经释放了,这代码就可以运行(3)
print("我是lock2")
time.sleep(1)
lock3.release() 开始释放 锁三 (4),
class Mythread3(Thread):
def run(self):
while True:
if lock3.acquire(): # 他已经上过锁了,所以这里要等待 锁三释放,(1) |||||锁三已经释放了,这代码就可以运行(5)
print("我是lock3")
time.sleep(1)
lock1.release() # 开始释放 锁一 (6), 然后循环运行
if __name__=="__main__":
lock1 = Lock() # 创建锁1
lock2 = Lock() # 创建锁2
lock2.acquire() # 给锁2 上锁
lock3 = Lock() # 创建锁 3
lock3.acquire() # 给锁 3 上锁, 到目前为止只有 锁1 还是开着,其他都被锁住了
p1 = Mythread1()
p2 = Mythread2()
p3 = Mythread3() # 一次创建线程 ,一共三个
p1.start() # 启动 三个线程
p2.start()
p3.start()
总结
上边实现同步用到了互斥锁, 运行一次 要拿到锁的控制权,否则都是等待,可以看出 他们就一个线程在运行,其他都在等结果, 达到了同步, 一直按照我们的指令进行运行。