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在同一时间只能 ...
随机推荐
- mysql 可重复读
概念 Repeatable Read(可重复读):即:事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容. 实现原理(MVCC [ 多版本并发控制 ...
- 一篇包含了react所有基本点的文章
去年,我写了一本关于学习React.js的小书,原来是大约100页. 今年我要挑战自己,把它归纳为一篇文章. 本文不会涵盖什么是React,或者为什么要学习它. 相反,这是面向已经熟悉JavaScri ...
- 关于ftp用户连接时出现500OOPS:can not change directory的解决办法
今天在使用Filezilla连接Linux的时候不能成功,显示"500 OOPS:cannot change directory:/root" 错误,如何解决呢? 默认下是没有开启 ...
- Python之路-pandas包的详解与使用
什么是pandas pandas是一种Python数据分析的利器,是一个开源的数据分析包,最初是应用于金融数据分析工具而开发出来的,因此pandas为时间序列分析提供了很好的支持.pandas是PyD ...
- Anaconda 安装及Python 多版本间切换
安装 Anaconda 安装anaconda 安装较为简单,这里参考官方文档:https://docs.continuum.io/anaconda/install/linux.html 在文件目录下执 ...
- 04.Linux-CentOS系统sudo权限配置
visudo权限配置普通用户的使用权限范围配置文件: (请根据自己公司需求配置) [root@localhost ~]# visudo ## Allow root to run any command ...
- 获取服务进程server.exe的pid(0号崩溃)
#include "stdafx.h" #include <windows.h> #include <iostream> #include <COMD ...
- c# 反射获取属性值 TypeUtils
using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...
- generator (1)
function array () { console.log(arguments) }; array(1,2,3) 从这里我们可以看出 数组的迭代方法里面有一个 属性 [Symbol.iterat ...
- macaca搭建
对于新鲜的事务总是那么好奇,在自动化的过程中,有幸了解到macaca,记录下安装过程,具体介绍请移步官网:https://github.com/macacajs/ python版本参考:https:/ ...