GIL和copy
GIL: Global Interpreter Lock 全局解释器锁
多任务执行占CPU
多任务占用CPU的资源消耗:进程>线程>协程
在cpython解释器中只有进程是真的多任务,线程和协程都是假的多任务
什么是全局解释器锁
在cpython解释器中,用多线程做多任务的事情,在全局有一个互斥锁在同一时刻只能允许一个线程在执行任务,其他线程排队等待获取锁,
如何解决GIL在cpython解释器中带来的问题
.根据程序的类型
计算密集型:进程,算法
IO密集型(input output):线程、协程
.换解释器
eg:
jpython
.换语言
因为python是一种解释性的语言,他可以兼容好多语言和平台
eg:
c语言,C++,C#,java
深浅拷贝:
深拷贝:拷贝一个内容,会拷贝所有信息. deepcopy()
浅拷贝:拷贝一个内容,只拷贝引用(引用地址中的数据). copy()
list:
深拷贝:
deepcopy() 拷贝所有数据
浅拷贝:
copy() 只拷贝引用地址,并没有拷贝内容
import copy
a = [, ]
b = [, ]
c = [a, b]
d = copy.copy(c)
e = copy.deepcopy(c)
print(id(c[]))
print(id(d[]))
print(id(e[]))
tuple:
普通元祖
深拷贝:deepcopy
浅拷贝:copy()
deepcopy()和copy()都只拷贝引用地址中的数据
元祖中是可变类型时:
深拷贝:
deepcopy() 拷贝所有数据
浅拷贝:
copy() 只拷贝引用地址中的数据
tuple()
a = (, )
b = (, )
c = (a, b)
d = copy.copy(c)
e = copy.deepcopy(c)
print(id(c))
print(id(d))
print(id(e))
+++++++++++
a = [, ]
b = [, ]
c = (a, b)
d = copy.copy(c)
e = copy.deepcopy(c)
a.append()
print(id(c[]))
print(id(d[]))
print(id(e[]))
print(c)
print(d)
print(e)
其他数据类型基本都是浅拷贝如: int float str
GIL和copy的更多相关文章
- HEC-ResSim原文档
HEC-ResSim Reservoir System Simulation User's Manual Version 3.1 May 201 ...
- GIL/Copy/私有/面向对象
1. GIL Python语言和GIL没有关系.仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL. GIL:全局解释器锁.每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个 ...
- Python 第八篇:异常处理、Socket语法、SocketServer实现多并发、进程和线程、线程锁、GIL、Event、信号量、进程间通讯
本节内容: 异常处理.Socket语法.SocketServer实现多并发.进程和线程.线程锁.GIL.Event.信号量.进程间通讯.生产者消费者模型.队列Queue.multiprocess实例 ...
- 33、线程与全局解释器锁(GIL)
之前我们学了很多进程间的通信,多进程并发等等,今天我们来学习线程,线程和进程是什么关系,进程和线程有什么相同而又有什么不同今天就来揭晓这个答案. 一.线程概论 1.何为线程 每个进程有一个地址空间,而 ...
- 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼
1. 操作系统基本知识,进程,线程 CPU是计算机的核心,承担了所有的计算任务: 操作系统是计算机的管理者,它负责任务的调度.资源的分配和管理,统领整个计算机硬件:那么操作系统是如何进行任务调度的呢? ...
- Python GIL锁
GIL全局解释器锁:为了解决多线程修改同一块数据. python的线程是调用操作系统的源生线程,启动时就是调用C语言的C源生接口,python调用C语言接口的线程去执行任务时,必须上下文对应关系传给C ...
- Python GIL 系列之再谈Python的GIL
1. 之前写过一篇<通过实例认识Python的GIL>的文章,感觉有些意犹未尽 2. 这次对例子作了些扩展,进一步的分析GIL对Python程序的影响 2.1 先来看例子: [python ...
- python中GIL和线程与进程
线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
- 线程、进程、daemon、GIL锁、线程锁、递归锁、信号量、计时器、事件、队列、多进程
# 本文代码基于Python3 什么是进程? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行 ...
随机推荐
- Oracle数据库创建表空间及用户授权
/*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace test_temp tempfile 'E:\app\Administrator\orad ...
- C++伪函数
#include <iostream> void say_hello() { std::cout << "hello world !" << s ...
- python实现汉诺塔(递归)
def hanoi(n, A, B, C): if n > 0: hanoi(n-1, A, C, B) print("%s->%s" % (A, C)) hanoi( ...
- RHEL6.5、RHEL7.2忘记ROOT密码恢复小结
RHEL6.5忘记root密码恢复步骤 RHEL7.2恢复密码步骤 5.耐心等待重启完成即可实现重置root密码 也可以按如下做法 依次执行chroot /sysroot/,passwd===> ...
- (转 )Unity对Lua的编辑器拓展
转 http://blog.csdn.net/ZhangDi2017/article/details/61203505 当前版本的Unity(截至Unity5.5.x)中TextAsset类不支持后缀 ...
- 配置组件的 props
组件是相互独立.可复用的单元,一个组件可能在不同地方被用到.但是在不同的场景下对这个组件的需求可能会根据情况有所不同,例如一个点赞按钮组件,在我这里需要它显示的文本是“点赞”和“取消”,当别的同事拿过 ...
- Split方法,拆分字符串后,去除返回的空值
我们在使用Split('')方法的时候,根据指定的 '字符' 对字符串进行拆分,当'字符’为最后一个,将会拆分一个空值进行返回. 这个时候我们可以使用 string.Split(new ch ...
- 常用的HTML5 pattern属性
type="tel" 和 type="number" 的区别 这里还是先那么先交代一下最初遇到的问题.其实无论是tel还是number都不是完美的: type= ...
- nginx 80端口重定向到443端口
server { listen ; server_name www.域名.com; rewrite ^(.*)$ https://${server_name}$1 permanent; } serve ...
- subprocess模块详解2
1.call() 和run功能类似,都是接受一个列表里的参数. >>> import subprocess >>> a = subprocess.call([&qu ...