线程中 有四个概念比较重要,

阻塞, 非阻塞, 同步 ,异步

阻塞: 就是只有当阻塞的程序运行完了,你才能结束,它不完成你就一定要等待 直到结束后,你再结束,前面我们介绍的线程或者 进程的 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()

总结

上边实现同步用到了互斥锁, 运行一次 要拿到锁的控制权,否则都是等待,可以看出 他们就一个线程在运行,其他都在等结果, 达到了同步, 一直按照我们的指令进行运行。