重点:多线程创建,多线程当中同步和互斥,生产者消费者模式。。***互斥锁***。local--理解为主
====================================
互斥锁锁的创建: 为了解决线程间竞争访问全局资源的问题。
- 格式:mutex = theading.lock() :创建互斥锁锁
- 线程先进行t = threading.Thread(target = func)功能函数
- 在func函数中,创建锁mutex.acquire()---进行所得申请,如果申请到,向下执行--阻塞方式进行
- mutex.release()释放锁
- flag =mutex.acquire(flase)---非阻塞方式申请#如果没申请到值,线程不等待,返回flase,如果申请到锁,返回值是true。返回的是布尔类型的值。
- 加锁和解锁的时间,在访问全局变量之前申请锁,在操作完全局变量值和解锁。
- 互斥锁的缺点,程序时间变长,降低效率。
死锁:
- 多线程\进程操作,各个线程\进程在相互等待对方锁的资源,造成的状态叫做死锁。
- split vertically 分屏 pycharm
- 解决死锁的方法,添加一个超时。如果其它锁未全部获得,则释放该锁。
- mutex.acquire(timeout = 3)等待3秒,没有获得直接释放。
- 互斥:要求一次一个操作,同步:要求一次一个按顺序操作。
同步:一次一个按顺序进行
- 锁的同步比较少见,锁的同步需要队列的传入。
- 生产者消费者队列: *当生产者能力大于消费者能力,仓库满时,生产者进入等待。*当消费者能力大于生产者能力,当仓库为空时,消费者进入等待。引入queue
- 耦合性指的是模块之间相互联系的程度。
- 线程当中的局部变量是各自私有的。线程类当中的局部变量也是各自私有的。
- ThreadLocal---创建全局的ThreadLocal对象。* bag = threading.local()创建全局对象。*bag,name = name对ThreadLocal()对象绑定name属性。*在没有传参的函数里让 a = gba.name。
- GIL ---全局解释器锁。。是cpython解释器设计留下的历史问题。任何线程在运行之前必须获取这个全局锁才能执行,每当执行完100条字节码,全局解释器锁会释放,切换到其他线程执行。有GIL意味着python在多核cpu当中是不能充分利用核数进行工作的。
- 多进程能够充分利用多核。