GIL 相关 和进程池
#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 相关 和进程池的更多相关文章
- GIL锁、进程池与线程池
1.什么是GIL? 官方解释: ''' In CPython, the global interpreter lock, or GIL, is a mutex that prevents multip ...
- python GIL锁、进程池与线程池、同步异步
一.GIL全局解释器锁 全局解释器锁 在CPython中,全局解释器锁(GIL)是一个互斥锁,它可以防止多个本机线程同时执行Python代码.之所以需要这个锁,主要是因为CPython的内存管理不是线 ...
- GIL锁、进程池与线程池、同步异步
GIL锁定义 GIL锁:Global Interpreter Lock 全局解释器 本质上是一把互斥锁 官方解释: 在CPython中,这个全局解释器锁,也称为GIL,是一个互斥锁,防止多个线程在同 ...
- GIL解释器锁 & 进程池与线程池
今日内容 GIL 全局解释器锁(重要理论) 验证 GIL 的存在及功能 验证 python 多线程是否有用 死锁现象 进程池与线程池(使用频率高) IO模型 详细参考: https://www.bil ...
- CIL锁,GIL与线程池的区别,进程池和线程池,同步与异步
一.GIL锁 什么是GIL? 全局解释器锁,是加在解释器上的互斥锁 GC是python自带的内存管理机制,GC的工作原理:python中的内存管理使用的是应用计数,每个数会被加上一个整型的计数器,表示 ...
- GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...
- 使用进程池规避Python的GIL限制
操作系统 : CentOS7.3.1611_x64 python版本:2.7.5 问题描述 Python的GIL会对CPU密集型的程序产生影响,如果完全使用Python来编程,怎么避开GIL的限制呢? ...
- 第三十八天 GIL 进程池与线程池
今日内容: 1.GIL 全局解释器锁 2.Cpython解释器并发效率验证 3.线程互斥锁和GIL对比 4.进程池与线程池 一.全局解释器锁 1.GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在 ...
- 并发编程:GIL,线程池,进程池,阻塞,非阻塞,同步,异步
一 GIL(global interpreter lock) GIL中文叫全局解释器锁,我们执行一个文件会产生一个进程,那么我们知道进程不是真正的执行单位,而是资源单位,所以进程中放有解释器(cpy ...
随机推荐
- 【洛谷p5015】标题统计
(写上瘾了再来一篇吧) 标题统计[传送门] 洛谷算法标签 字符串这种东西,我看到是崩溃的.因为我们只学到了二维数组[这个梗自行get],总之我们当时还没有学.然后显然就是各种翻书,各种百度.大致了解了 ...
- spring boot(十一)MongoDB的使用
mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...
- centos7 keepalived+nginx实现vip漂移高可用
一.Keepalived 简要介绍 Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Nginx 可以实现 web 前 ...
- Oracle PL/SQL异常、存储过程和触发器
一.异常 1.处理异常 (1)除数不为0 declare b number; begin b:; exception when zero_divide then dbms_output.put_lin ...
- InnoDB存储引擎介绍-(6) 二. Innodb Antelope文件格式
InnoDB存储引擎和大多数数据库一样(如Oracle和Microsoft SQL Server数据库),记录是以行的形式存储的.这意味着页中保存着表中一行行的数据.到MySQL 5.1时,InnoD ...
- asm ftp utilty and usage
Oracle 11g ASM supports ASM FTP, by which operations on ASM files and directories can be performed s ...
- ActiveMQ 中的链表
ActiveMQ 中的消息在内存中时,以链表形式保存,以 PendingList 表示,每一个消息是 PendingNode. PendingList 主要有2种实现:OrderedPendingLi ...
- Nginx反向代理配置教程(php-fpm)
1.安装nginx http://www.cnblogs.com/lsdb/p/6543441.html 2.安装php-fpm yum install -y php-fpm 3.配置Nginx反向代 ...
- 牛客网 PAT 算法历年真题 1010 : 月饼 (25)
月饼 (25) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 月饼是中国人在中秋佳节时吃的一种传统食品,不同地 ...
- LY.JAVA.DAY12.String类
2018-07-24 14:06:03 String类概述 字符串是由多个字符组成一串数据(字符序列) 字符串可以看成字符数组 一旦被赋值就不能被改变 值不能变 1.过程概述: 方法区---字符 ...