21.线程,全局解释器锁(GIL)
import time
from threading import Thread
from multiprocessing import Process
#计数的方式消耗系统资源 def two_hundred_million(): start_time = time.time() i = 0
for _ in range(200000000):
i = i +1 end_time = time.time() print("Total time:{}".format(end_time-start_time)) def one_hundred_million(): start_time = time.time() i = 0
for _ in range(100000000):
i = i +1 end_time = time.time() print("Total time:{}".format(end_time-start_time)) if __name__ == "__main__":
#单线程--主线程
# two_hundred_million()#Total time:15.068861722946167 #多线程
# for _ in range(2):
# t = Thread(target=one_hundred_million)
# t.start()
#Total time:16.740957498550415
#Total time:16.911967515945435 #使用多进程避免GIL的影响
'''
multiprocess库的出现在很大程度是为了弥补thread库,
因为GIL而低效率的缺陷,它完整的复制了一套thread提供的接口
方便迁移,唯一的不同就是它使用了多进程而不是多线程,每个进程有自己独立的GIL
因此不会出现进程之间的GIL争抢问题
'''
#多进程
for _ in range(2):
p = Process(target=one_hundred_million)
p.start()
#Total time:9.545545816421509
#Total time:9.60754942893982 #注意
'''
多进程的引入会增加程序实现时线程间数据通讯和同步的困难
计数器:
如果我们要使用多个线程累加同一变量,声明global变量,用thread.Lock()
thread.release()包住全局变量.多进程不能使用同一个全局变量,只能通过
Queue队列,put和get的方法来共享数据通讯.
这就会产生额外的成本,使编程变得更加复杂
''' #1.线程不常用,原因是底层有全局解释器锁
'''
python代码是由python虚拟机执行,(又叫解释器主循环),进行控制.
python在设计的时候是这样考虑的,在主循环中同时只能由一个控制线程在执行
就像单核CPU系统中的多进程一样,内存中可以有许多程序,但是在任意给定时刻,
只能有一个程序在运行.同理,尽管python解释器中可以运行多个线程,但是
在任意的给定时刻只有一个线程会被解释器执行
对python虚拟机的访问是由全局解释器锁(GIL)控制,这个锁就是用来保证
同时只能有一个线程在运行.
'''
21.线程,全局解释器锁(GIL)的更多相关文章
- python 线程队列、线程池、全局解释器锁GIL
一.线程队列 队列特性:取一个值少一个,只能取一次,没有值的时候会阻塞,队列满了,也会阻塞 queue队列 :使用import queue,用法与进程Queue一样 queue is especial ...
- 全局解释器锁GIL & 线程锁
1.GIL锁(Global Interpreter Lock) Python代码的执行由Python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行 ...
- python并发编程之线程(一):线程&守护线程&全局解释器锁
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.pyth ...
- 全局解释器锁GIL
我们使用高并发,一次是创建1万个线程去修改一个数并打印结果看现象: from threading import Thread import os def func(args): global n n ...
- python开发线程:线程&守护线程&全局解释器锁
一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 官网链接:https://docs.python ...
- python 什么是全局解释器锁GIL
什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在 ...
- 并发编程——全局解释器锁GIL
1.全局解释器锁GIL GIL其实就是一把互斥锁(牺牲了效率但是保证了数据的安全). 线程是执行单位,但是不能直接运行,需要先拿到python解释器解释之后才能被cpu执行 同一时刻同一个进程内多个线 ...
- python 多线程编程之使用进程和全局解释器锁GIL
本文主要介绍如何在python中使用线程. 全局解释器锁: python代码的执行是由python虚拟机(又名解释器主循环)进行控制的.python中,主循环中同时只能有一个控制线程在执行,就像单核C ...
- Python全局解释器锁 -- GIL
首先强调背景: 1.GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定. 2.每个CPU在同一时间只能 ...
随机推荐
- mybatis的<用<![CDATA[]] 忽略解析
1 CDATA 术语 CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data). 在 XML 元素中,"<" 和 &quo ...
- Linux安装postgresql及基础操作
安装环境说明 系统环境说明 [root@slave1 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@sl ...
- ln创建软链接方式
ln -s 目标文件 软链接
- 联想ideapad 310s如何进BIOS,换固态硬盘SSD,配置U盘启动,重装Win10系统
1. 如何进BIOS 关机情况下,捅一下Novo键,即可进入BIOS 2. 安装固态硬盘 Ideadpad 310S 本身自带的硬盘是5400转的机械硬盘,容量小速度慢.换的新的固态硬盘是SATA接口 ...
- 了解Greenplum (2)
一.目的 1. 理解Greenplum中的数据分布策略(random 和 distribution),分析不同分布策略的优劣:2. 理解查询执行中的数据广播和数据重分布,分析在何种情况下选择哪种策略, ...
- 洛谷P3158 [CQOI2011]放棋子 组合数学+DP
题意:在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列.有多少祌方法? 解法:这道题不会做,太菜了qwq.题解是看洛谷大佬的. 设C是组合数, ...
- Reference与ReferenceQueue
Reference源码分析 首先我们先看一下Reference类的注释: /** * Abstract base class for reference objects. This class def ...
- 06.队列、python标准库中的双端队列、迷宫问题
class QueueUnderflow(ValueError): """队列为空""" pass class SQueue: def __ ...
- springboot2.0整合redis的发布和订阅
1.Maven引用 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- @ControllerAdvice全局数据绑定
@ModelAttribute 注解标记该方法的返回数据是一个全局数据,默认情况下,这个全局数据的 key 就是返回的变量名,value 就是方法返回值,当然开发者可以通过 @ModelAtt ...