多线程竞争、锁、互斥锁、死锁、GIL

多线程竞争

同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态,数据几乎同步会被多个线程占用,造成数据混乱。

Python提供的对线程控制的对象。

锁的好处:
确保了某段关键代码只能由一个线程从头到尾完整地执行

锁的坏处:

  • 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了
  • 由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁

互斥锁

某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。

死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。

避免死锁:

  • 程序设计时要尽量避免(银行家算法:每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁。)。
  • 添加超时时间。

GIL

GIL (全局解释器锁)实际就是一把互斥锁,只有在cpython中才有,限制多线程同时执行,保证同一时间只有一个线程执行,所以cpython中的多线程其实是伪多线程,经常使用协程代替线程。

解决方案:

    • 换解释器 GIL 只有cpython有 可以换 jpython
    • 换多进程 少用线程
    • 用C语言扩展
原文地址:https://www.cnblogs.com/hanybblog/p/13412086.html