zoukankan      html  css  js  c++  java
  • 多线程竞争、锁、互斥锁、死锁、GIL

    多线程竞争

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

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

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

    锁的坏处:

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

    互斥锁

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

    死锁

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

    避免死锁:

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

    GIL

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

    解决方案:

      • 换解释器 GIL 只有cpython有 可以换 jpython
      • 换多进程 少用线程
      • 用C语言扩展
  • 相关阅读:
    jQuery入门和DOM对象
    jQuery事件
    基础,层次,选择器
    MarkDown快速入门(typora)
    source是读入环境配置文件的命令,不能读入vimrc
    vi中将tab键转化为空格
    django-rest-framework学习之Quickstart和Serializer--2017年4月10日至12日
    Flask-RESTful插件介绍--2017年4月7日
    python restful api 编程--2017年4月6日
    一个验证登录的程序:python编写flask架构restful风格--2017年4月6日
  • 原文地址:https://www.cnblogs.com/hanybblog/p/13412086.html
Copyright © 2011-2022 走看看