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在同一时间只能 ...
随机推荐
- char 指针如何判断字符串需要输出长度
先上代码: #include <stdio.h> #include <string.h> ] = "; int func1(const char *ip) { pri ...
- Django - Xadmin (五) POP
Django - Xadmin (五) POP 功能及逻辑描述 pop 功能:在添加数据时,对于需要选择的多对多字段,在其 input 框边加上一个按钮,点击该按钮可以实现跳转到添加该字段数据的页面: ...
- 剑指offer--字符串
C/C++中每个字符串都以字符'\0'作为结尾,这样我们就可以很方便的找到字符串最后的尾部.由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界. 为了节省内存,C/C++把 ...
- Java虚拟机——Class类文件结构
Class文件格式采用一种类似C语言结构体的结构来存储数据,这种数据结构只有两种数据类型:无符号数和表. 无符号数属于基本的数据类型,数据项的不同长度分别用u1, u2, u4, u8表示, ...
- C++中的const_cast
开发环境 Qt Creator 4.8.2 编译器版本 MinGw 32-bit const_cast 用法: const_cast<type_id> (expression) 说明: 该 ...
- k8s源码编译
1.可在github上面直接下载源码 2.下载所需要的docker镜像,并打上tag,不知道tag,可以先编译一下,会提示所需image. docker pull index.alauda.cn/xu ...
- struts2的相关知识(实现原理、拦截器)
struts2的实现原理 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的 ...
- AOP 和 IOC
IOC : 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...
- Atcoder2134 Zigzag MST
问题描述 We have a graph with N vertices, numbered 0 through N−1. Edges are yet to be added. We will pro ...
- maven-enforcer-plugin查看冲突
我们会经常碰到这样的问题,在pom中引入了一个jar,里面默认依赖了其他的jar包.jar包一多的时候,我们很难确认哪些jar是我们需要的,哪些jar是冲突的.此时会出现很多莫名其妙的问题,什么类找不 ...