ps:python解释器有很多种,最常见的就是C python解释器

GIL全局解释器锁:
    GIL本质上是一把互斥锁:将并发变成串行,牺牲效率保证了数据的安全

    用来阻止同一个进程下的多个线程的同时执行(同一个进程内多个线程无法实现并行但是可以实现并发)

    GIL的存在是因为C python解释器的内存管理不是线程安全的

    垃圾回收机制:

        1、引用计数

        2、标记清除

        3、分代回收

    研究python 的多线程是否有用的话需要分情况讨论:

        同时执行四个任务  计算密集型:10s

# 计算密集型
from multiprocessing import Process
from threading import Thread
#mport os,time
def work():res=0for i in range(100000000):res*=iif __name__ == '__main__':l=[]print(os.cpu_count())  # 本机为6核start=time.time()for i in range(6):# p=Process(target=work) #耗时  4.732933044433594p=Thread(target=work) #耗时 22.83087730407715
        l.append(p)p.start()for p in l:p.join()stop=time.time()print('run time is %s' %(stop-start))

        单核情况下:

            开线程更节省资源

        多核情况下:

            开进程:10s

            开线程:40s

        同时执行四个IO密集型任务

# IO密集型
from multiprocessing import Process
from threading import Thread
import threading
import os,time
def work():time.sleep(2)if __name__ == '__main__':l=[]print(os.cpu_count()) #本机为6核start=time.time()for i in range(4000):p=Process(target=work) #耗时9.001083612442017s多,大部分时间耗费在创建进程上# p=Thread(target=work) #耗时2.051966667175293s多
        l.append(p)p.start()for p in l:p.join()stop=time.time()print('run time is %s' %(stop-start))

        单核:开线程更省资源

        多核:开线程更省资源

    

Event事件:

    

from threading import Event,Thread
import time# 先生成一个event对象
e = Event()def light():print('红灯正亮着')time.sleep(3)e.set()  # 发信号print('绿灯亮了')def car(name):print('%s正在等红灯'%name)e.wait()  # 等待信号print('%s加油门飙车了'%name)t = Thread(target=light)
t.start()for i in range(10):t = Thread(target=car,args=('伞兵%s'%i,))t.start()

信号量:在不同的领域中,对应不同的知识点

    互斥锁:一个厕所(一个坑)
    信号量:公共厕所(多个坑位)

from threading import Semaphore,Thread
import time
import randomsm = Semaphore(5)  # 造了一个含有五个的坑位的公共厕所def task(name):sm.acquire()print('%s占了一个坑位'%name)time.sleep(random.randint(1,3))sm.release()for i in range(40):t = Thread(target=task,args=(i,))t.start()

  

死锁:

    RLock可以被第一个抢到锁的人连续的acquire和release

    每acquire一次锁身上的计数就加1

    每release一次锁身上的计数就减1

    只要是锁的计数不为0 其他人都不能抢

class MyThread(Thread):def run(self):  # 创建线程自动触发run方法 run方法内调用func1 func2相当于也是自动触发
        self.func1()self.func2()def func1(self):mutexA.acquire()print('%s抢到了A锁'%self.name)  # self.name等价于current_thread().name
        mutexB.acquire()print('%s抢到了B锁'%self.name)mutexB.release()print('%s释放了B锁'%self.name)mutexA.release()print('%s释放了A锁'%self.name)def func2(self):mutexB.acquire()print('%s抢到了B锁'%self.name)time.sleep(1)mutexA.acquire()print('%s抢到了A锁' % self.name)mutexA.release()print('%s释放了A锁' % self.name)mutexB.release()print('%s释放了B锁' % self.name)for i in range(10):t = MyThread()t.start()

递归锁:

import threadingclass MyThread(threading.Thread):def run(self):global n1, n2lock.acquire()   # 加锁n1 += 1print(self.name + ' set n1 to ' + str(n1))lock.acquire()   # 再次加锁n2 += n1print(self.name + ' set n2 to ' + str(n2))lock.release()lock.release()n1, n2 = 0, 0
lock = threading.RLock()if __name__ == '__main__':thread_list = []for i in range(5):t = MyThread()t.start()thread_list.append(t)for t in thread_list:t.join()print('final num:%d ,%d' % (n1, n2))

转载于:https://www.cnblogs.com/tulintao/p/11354459.html

python基础--GIL全局解释器锁、Event事件、信号量、死锁、递归锁相关推荐

  1. Python高级——GIL全局解释器锁问题

    GIL全局解释器锁 GIL全局解释器锁是cpython解释器内部的一把锁,和python中的lock锁不是一个层面. GIL产生的背景:在cpython解释内部运行多个线程的时候,每个线程都需要解释器 ...

  2. python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解

    GIL是解释器内部的一把锁,确切一点说是CPython解释器内部的一把锁,所以要注意区分 这和我们在Python代码中使用线程锁Lock并不是一个层面的概念. 1. GIL产生的背景: 在CPytho ...

  3. 并发服务器的信号传递,使服务器支持并发、GIL全局解释器锁、死锁和Rlock、信号量、event事件、...

    服务器的并发实现: 服务端: importsocketfrom threading importThread"""服务端 1.要有固定的IP和PORT 2.24小时不间断 ...

  4. 4,GIL全局解释器锁,event事件,信号量

    今日内容 1,GIL全局解释器锁 2,死锁 3,信号量 4,event事件 5,队列一:GIL全局解释器锁 什么是GIL 全局解释器锁: 它的本质也是一把互斥锁,是在CPython解释器锁,将并发变为 ...

  5. Python中的GIL(全局解释器锁)

    1. GIL全称Global Interpreter Lock,每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码. 2.GIL的缺点 GIL使Python不能充分利用多核心 ...

  6. 【Python爬虫学习笔记11】Queue线程安全队列和GIL全局解释器锁

    Queue线程安全队列 在Python多线程编程中,虽然threading模块为我们提供了Lock类和Condition类借助锁机制来处理线程并发执行,但在实际开发中使用加锁和释放锁仍是一个经常性的且 ...

  7. python GIL 全局解释器锁详解

    Python多线程另一个很重要的话题--GIL(Global Interpreter Lock,即全局解释器锁)鲜有人知,甚至连很多Python老司机都觉得GIL就是一个谜 一.一个不解之谜 耳听为虚 ...

  8. Python GIL全局解释器锁

    目录 GIL全局解释器锁 一.引入: 二.GIL介绍 三.GIL与Lock 四.GIL与多线程 总结 GIL全局解释器锁 一.引入: 首先要明白,GIL并不是Python的一个特性,其实在我们通常所称 ...

  9. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

最新文章

  1. Kaggle比赛的进阶技巧和国内比赛前十套路
  2. NC:遗传发育所Speakman组-棕色脂肪是无菌小鼠改善血糖的关键
  3. memcached完全剖析–1. memcached的基础
  4. 十种创业病 你得了几个?
  5. 使用 WordPress 插件模板开发高质量插件
  6. 统计学基础一:基础概念
  7. DevOps 火爆,要学这么多技术!
  8. HTML5 开源游戏引擎 LayaAir
  9. php mysql注册登录失败_php用户注册登录,不使用mysql
  10. 根据一个单词找所有的兄弟单词的思想如何处理
  11. python 可视化设计_可视化Python设计工具
  12. 鸿蒙超级终端使用教程,超级终端怎么用(超级终端使用配置教程)
  13. 2012“第四届云计算中国峰会”倒计时
  14. zkeacms mysql_在Docker中运行纸壳CMS并配置使用MySql
  15. 计算机应用基础2020年最新档案,计算机应用基础 高职计算机大类专业 刁爱军项目三 人事档案管理.pptx...
  16. 偷偷爆料下 955 不加班公司名单(2023 年最新版!)
  17. 【论文笔记】ASYMMETRIC SELF-PLAY FOR AUTOMATIC GOAL DISCOVERY IN ROBOTIC MANIPULATION
  18. Unity HybridCLR热更新技术实现
  19. Android 屏蔽第三方SDK权限
  20. Java实现字母转化

热门文章

  1. 阿里云首发Dubbo3.0 + Nacos2.0
  2. 高露洁、悦诗风吟、Benefit,618大促的数字化难题都是如何解决的?
  3. Tuomas Pirinen:创造游戏人物的8个方法
  4. “使命召唤”的新“吃鸡”模式味道如何?
  5. 从《英雄联盟》的装备系统谈玩家行为与游戏设计
  6. 在Unity实现游戏命令模式
  7. ASP.NET Core【在线教育系统】功能要求
  8. 常见Java面试题 抽象类能使用 final 修饰吗?
  9. linux find 排除某目录或文件 执行
  10. Oracle技术牛人网站