#GIL  (global interpreter Lock)

#全局解释器锁 :锁是为了避免资源竞争造成数据错乱

#当一个py启动后 会先执行主线程中的代码
#在以上代码中有启动了子线程 子线程的任务还是执行代码
#解释器在一个进程中只有一个(解释器也是一堆代码)
#主线和子线都要去调用解释器,就存在了竞争关系 #全局解释器锁: 是为了防止多个线程同时使用python解释器 一旦加锁 将导致线程无法并行
#这个问题不是所有解释器都存在 只有cpython(c写的解释器) 也就是说只有cpythonzhong
#有全局解释器锁 如果是Jpython 就要参考Java的多线程实现
#python程序的执行:
#1.启动解释器进程 python.exe
#2.解析py文件并执行它 # 每个py程序中都必须有解释器参与 解释器其实就是一堆代码
#相当于多个线程要调用同一个解释器代码 共享变成竞争 竞争就要出事 给解释器加互斥锁 # python中内存管理依赖于GC(一段用于回收内存的代码) 也需要一个线程 除了自己开的线
# 程 系统还有一些内置线程 就算你的代码不会去竞争解释器 内置线程也可能会竞争 所以
# 所以必须加上锁 #当一个线程遇到了IO 同时解释器也会自动解锁 去执行其他线程 cpu会切换到其他程序
# 案例:
# from threading import Thread
# import time
# def task1():
# sum=1
# for i in range(10000000):
# sum+=i
# def task2():
# sum=1
# for i in range(10000000):
# sum+=i
# start=time.time()
# t1=Thread(target=task1)
# t2=Thread(target=task2)
# t1.start()
# t2.start()
# t1.join()
# t2.join()
# print(time.time()-start) #解释器加锁以后:
#将导致所有线程只能并发 不能达到真正的并行 意味着同意时间只有一个cpu在处理你的
#线程 给你的感觉是小路低 #代码执行有两种状态;
#阻塞 i/o :失去cpu的执行权 (cpu等待I/O完成)
#非阻塞 :代码正常执行 比如循环一千万次 中途cpu可能切换 但是很快会回来(cpu在计算) #加入有32核cpu 要处理一个下载任务 网络速度慢 100k/s 文件大小为1024kb 如果你的代码中
#IO操作非常多 cpu性能不能直接决定你的任务处理速度 #案例:
#目前有三个任务 每个任务处理需要一秒 获取元数据需要一小时
#3个cpu 需要一小时一秒
#1个cpu 需要一小时三秒 #在IO密集的程序中 cpu性能无法直接决定程序的执行速度 python就应该干这种活儿
#在计算密集的程序中 cpu性能可以直接决定程序的执行效率 #2.GIL与互斥锁
#GIL与互斥锁:
# from threading import Thread,Lock
# import time
# mutex=Lock()
# num = 1
# def task():
# global num
# mutex.acquire()
# temp=num
# time.sleep(1) #当线程中出现io时 GIL锁就解开了
# num=temp+1
# mutex.release()
# t1=Thread(target=task,)
# t2=Thread(target=task,)
# t1.start()
# t2.start()
# t1.join()
# t2.join()
# print(num)
# #GIL和自定义互斥锁的区别
# #全局锁不能保证自己的线程安全 但是保证解释器中的数据安全
# #GIL在线程调用解释器时 自动加锁 IO阻塞时和线程代码执行完毕时 自动解锁
#
#3.线程池与进程池
# 进程池: 就是一个装进程的容器
# 为什么出现: 当进程很多的时候方便管理进程
# 什么时候用:当并发量特别大的时候 例如双十一 很多时候进程是空闲的 就让他进入进程池
#让有任务处理的进程进入进程池
# 进程池:
# ProcessPoolExecutor
# 创建时指定最大进程数 自动创建进程
# 调用submit函数将任务提交到进程池中
# 创建进程是在调用submit后发生的
#举例:
# #收发数据
# def task(c,addr):
# while True:
# data=c.recv(1024)
# print(data.decode("utf-8"))
# if not data:
# c.close()
# break
# c.send(data.upper())
# if __name__ == '__main__':
# import socket
# from concurrent.futures import ProcessPoolExecutor
# server=socket.socket()
# server.bind(("127.0.0.1",8091))
# server.listen(5)
# #创建一个进程池 默认
# pool=ProcessPoolExecutor()
# while True:
# c,addr = server.accept()
# pool.submit(task,c,addr) #总结一下:
# 进程池可以自动创建进程
# 进程限制最大进程数
# 自动选择一个空闲的进程帮你处理任务

GIL 相关 和进程池的更多相关文章

  1. GIL锁、进程池与线程池

    1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip ...

  2. python GIL锁、进程池与线程池、同步异步

    一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线 ...

  3. GIL锁、进程池与线程池、同步异步

    GIL锁定义 GIL锁:Global Interpreter Lock  全局解释器 本质上是一把互斥锁 官方解释: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同 ...

  4. GIL解释器锁 & 进程池与线程池

    今日内容 GIL 全局解释器锁(重要理论) 验证 GIL 的存在及功能 验证 python 多线程是否有用 死锁现象 进程池与线程池(使用频率高) IO模型 详细参考: https://www.bil ...

  5. CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步

    一.GIL锁 什么是GIL? 全局解释器锁,是加在解释器上的互斥锁 GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示 ...

  6. GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

    GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...

  7. 使用进程池规避Python的GIL限制

    操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 Python的GIL会对CPU密集型的程序产生影响,如果完全使用Python来编程,怎么避开GIL的限制呢? ...

  8. 第三十八天 GIL 进程池与线程池

    今日内容: 1.GIL 全局解释器锁 2.Cpython解释器并发效率验证 3.线程互斥锁和GIL对比 4.进程池与线程池 一.全局解释器锁 1.GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在 ...

  9. 并发编程:GIL,线程池,进程池,阻塞,非阻塞,同步,异步

    一  GIL(global interpreter lock) GIL中文叫全局解释器锁,我们执行一个文件会产生一个进程,那么我们知道进程不是真正的执行单位,而是资源单位,所以进程中放有解释器(cpy ...

随机推荐

  1. SQL SERVER 一组数据按规律横着放置,少则补空,如人员按一进一出的规律,进出为一组,缺少的补null

    假设一组数据:人员进出刷卡数据表[SwingCard] ID MenID Door 1 1 In 2 1 In 3 1 Out 4 1 In 5 1 Out 6 1 Out 想要变成如下:一进一出为一 ...

  2. python记录_day03 字符串

    python基本数据类型回顾 1. int 整数 2. str 字符串. 不会用字符串保存大量的数据 3. bool 布尔值. True, False 4. list 列表(重点) 存放大量的数据 5 ...

  3. 用curl模拟夹带cookie的http请求

    1. 首先登录所要登录的网站,发起http请求,获取cookie 2. 获取请求的真正的路径,现在的前端比如vue都是用自定义路径映射后端路径的,比如在vue中某个请求为caojiangjiang/t ...

  4. 【转】预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法

    [转]预装Win8/8.1 中文版系统升级为专业版或专业版含媒体中心版的简单方法 原文地址:http://www.iruanmi.com/upgrade-win8-china-to-a-higher- ...

  5. java集合的实现细节--ArrayList和LinkedList

     ArrayList和LinkedList的实现差异 List代表一种线性表的数据结构,ArrayList则是一种顺序存储的线性表,ArrayList底层采用动态数组的形式保存每一个集合元素,Link ...

  6. ssm的web项目,浏览器使用get方法传递中文参数时,出现乱码

    ssm的web项目,浏览器使用get链接传递的为中文参数时,出现乱码 做搜索功能时,搜索手机,那么浏览器传递的参数为中文参数“手机”,但传递的默认编码格式为iso-8859-1,所以传到后台时,是乱码 ...

  7. [LeetCode] 20. Valid Parentheses ☆

    转载:https://leetcode.windliang.cc/leetCode-20-Valid%20Parentheses.html 描述 Given a string containing j ...

  8. InnoDB支持的最大事务数量

    Innodb存储引擎有rollback segment,每个rollback segment中记录了1024个undo log segment,在每个undo log segment中进行undo页的 ...

  9. curl和wget的区别和使用

    curl和wget基础功能有诸多重叠,如下载等. 非要说区别的话,curl由于可自定义各种请求参数所以在模拟web请求方面更擅长:wget由于支持ftp和Recursive所以在下载文件方面更擅长.类 ...

  10. 【oracle】一些的常用命令

    命令行连接oracle sqlplus  回车 分别输入用户名和密码 命令行重启oracle数据库 sqlplus /nolog conn 账号/密码 as sysdba shutdow immedi ...