#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. CentOS6启动流程

    CentOS6启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 在通电之后,CentOS6会进行加电自检(Power On Self Test),这个过程主要是由BIOS完成的.在自检完毕,会 ...

  2. MyBatis中mybatis-generator代码生成的一般过程

    MyBatis框架的使用,可以参考我的文章: https://blog.csdn.net/JayInnn/article/details/81746571(基于Mybatis实现一个查库的接口) ht ...

  3. php多线程代码

    <?php$thNum = 20; //20个进程$total = 20000;//总数$pageNum=100;//每个页面显示100条数据 $pageCount = ceil($total/ ...

  4. Oracle11g温习-第十四章:约束( constraint )

    2013年4月27日 星期六 10:48 1.约束的功能 通过一些强制性商业规则,保证数据的完整性.一致性 2.约束的类别 1 )  not null    不允许为空     2 )  check  ...

  5. Linux 命令查询工具

    http://man.linuxde.net/traceroute http://man.linuxde.net/ping http://man.linuxde.net/nslookup 等等

  6. set unused的用法(ORACLE删除字段)

    set unused的用法(ORACLE删除字段) 一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用alter table1 drop (colu ...

  7. maven聚合工程使用如何debug

    maven聚合工程在正常情况下,使用debug时会出错,因为没有源码,就不会显示代码和断点行数条. 进行如下操作: 默认情况下source下只有默认的default文件夹,点击remove进行删除(这 ...

  8. this.$route和this.$router的区别

    1. this.$router: 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法: 2. thi ...

  9. PE文件结构解析

    说明:本文件中各种文件头格式截图基本都来自看雪的<加密与解密>:本文相当<加密与解密>的阅读笔记. 1.PE文件总体结构 PE文件框架结构,就是exe文件的排版结构.也就是说我 ...

  10. 码云git使用一(上传本地项目到码云git服务器上)

    主要讲下如果将项目部署到码云git服务器上,然后使用studio导入git项目,修改本地代码后,并同步到码云git上面. 首先:我们在码云上注册账号并登陆.官网(https://git.oschina ...