puthon中同步与互斥知识

重点:多线程创建,多线程当中同步和互斥,生产者消费者模式。。***互斥锁***。local--理解为主


====================================
互斥锁锁的创建: 为了解决线程间竞争访问全局资源的问题。

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

猜你喜欢

转载自blog.csdn.net/Chen_chong__/article/details/72855591