day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁
今日内容:
1.线程理论
2.锁: 牺牲了效率,保证了数据的安全(重点)
3.守护线程
4.GIL锁:(重点)
5.计算密集型和IO密集型
6.信号量,事件(了解)
7.补充. 子进程中不能input
1.线程理论
什么是线程:cpu的执行单位(实体)
进程: 资源分配单位
线程的创建和销毁的开销特别小
线程之间的资源共享,共享的是同一个进程中的资源
资源的共享涉及的最主要的问题就是数据的安全问题,这里我们就要用到加锁来实现.
线程的2种创建方式
方法1:
from threading import Thread
def f1(n):
print(n)
if __name__=='__main__':
t=Thread(target=f1,args=(3,) )
t.start()
方法2:
class mythread(thread):
def __init__(self,n):
super().__init__()
self.n=n
def run(self):
print(f'{n}号种子选手.')
if __name__=='__main__':
m=mythread('alex')
m.start()
2.锁: 牺牲了效率,保证了数据的安全(重点)
死锁现象: 当程序代码中出现了锁的嵌套,两个程序相互争抢拿锁,导致一方拿到一把锁,但是需要下一把锁的时候,双方都在等待对方开锁,所以导致了死锁的现象.
递归锁:(重点推荐) 他可以解决死锁的现象
import RLock 首先递归锁本身就是一个互斥锁,维护了一个计数器,每次acquire一次就加一,release一次就减一,当计数器的值为0的时候,剩下的程序才能继续抢这个锁.
3.守护线程: 等待所有的非守护线程结束时他直接结束. 如果守护线程之外的所有线程执行完毕后,守护线程直接完毕(守护线程已经执行了的部分也是会被打印的)
守护进程: 主进程的代码结束后,守护进程直接结束(不管运没运行完毕).
import time
from threading import Thread
from multiprocessing import Process
def f1():
time.sleep(2)
print('1号线程')
def f2():
time.sleep(3)
print('2号线程')
if __name__ == '__main__':
# t1 = Thread(target=f1,)
# t2 = Thread(target=f2,)
# t1.daemon = True
# t2.daemon = True
# t1.start()
# t2.start()
# print('主线程结束')
t1 = Process(target=f1, )
t2 = Process(target=f2, )
# t1.daemon = True
# # t2.daemon = True
t1.start()
t2.start()
print('主进程结束'
4.GIL锁:(重点)
GIL锁: 全局解释器锁,他的本身就是一个互斥锁
解释器内部程序不支持多个线程同时解释
多个进程可以应用多核技术,因为每个进程里面都有解释器程序
这个图的含义是代码可以有多个进程进入cpu去执行,但是一个进程里面只允许有一个线程进入python解释器中解释.
原理: 首先硬盘接收到一个执行进程的数据,硬盘去内存开启一个空间,然后进程中的n条代码去cpython解释器中争抢进入cpython 解释器.由于解释器中存在GIL锁,所以只能有一条数据进入cpython解释器中去执行代码.争抢到的代码先到编译器中编译成c语言的字节码(.pyc文件),然后到虚拟机中转化为2进制文件,最后虚拟机将2进制文件发送给cpu去执行这段代码.
5.计算密集型和IO密集型
计算密集型数据,
如果两边同时运行,这边计算一点点,然后切换到另一遍计算一点点,也是可以的,但是再切换的同时切换也是会耗时间的,如果一个程序代码量很大,机器来回进行切换所耗的时间也是很长的.
IO密集型数据
这样程序遇到了IO就进行切换,提高了代码的运行效率
6.信号量,事件(了解)
7.补充. 子进程中不能input
from threading import Thread
from multiprocessing inport Process
def f1():
name=input('请输入你的姓名:') # 子程序中不能使用input
print(name)
if __name__=='__main__':
input('请输入你的信息:') #主程序中可以使用input,
t=Thread(target=f1,)
t.start()
print('主程序结束')
day33 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁的更多相关文章
- 并发编程8 线程的创建&验证线程之间数据共享&守护线程&线程进程效率对比&锁(死锁/递归锁)
1.线程理论以及线程的两种创建方法 2.线程之间是数据共享的与join方法 3.多线程和多进程的效率对比 4.数据共享的补充线程开启太快 5.线程锁 互斥锁 同步锁 6.死锁现象和递归锁 7.守护线程 ...
- python 线程(创建2种方式,锁,死锁,递归锁,GIL锁,守护进程)
###############总结############ 线程创建的2种方式(重点) 进程:资源分配单位 线程:cpu执行单位(实体) 线程的创建和销毁的开销特别小 线程之间资源共享,是同一个 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- 多线程(四) 实现线程范围内模块之间共享数据及线程间数据独立(Map集合)
多个线程访问共享对象和数据的方式 1.如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做. 2.如果每个线程执行的代码 ...
- 学习笔记4_ServletContext(重要整个Web应用的动态资源之间共享数据)
ServletContext(重要) 一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 与天地同寿!! ...
- Android应用程序组件Content Provider在应用程序之间共享数据的原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...
- 让AngularJS的controllers之间共享数据
如何让controller之间共享数据呢?大致是让不同controller中的变量指向同一个实例. 通过service创建一个存放共享数据的对象. .service("greeting&qu ...
随机推荐
- redux与redux-react使用示例
redux使用 <script type="text/babel"> var Counter=React.createClass({ incrementIfOdd:fu ...
- 大数据新手之路二:安装Flume
Ubuntu16.04+Flume1.8.0 1.下载apache-flume-1.8.0-bin.tar.gz http://flume.apache.org/download.html 2.解压到 ...
- Python splinter 环境搭建
今天无意间看到了splinter. Splinter是一个使用Python开发的开源Web应用测试工具.它可以帮你实现自动浏览站点和与其进行交互. Splinter对已有的自动化工具(如:Seleni ...
- Unity中角度与弧度之间的相互转换
弧度数 = 角度数 * Mathf.Deg2Rad角度数 = 弧度数 * Mathf.Rad2Deg
- (4)进程---daemon守护线程和join阻塞
join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用 ...
- v891 安卓平板的root
看了 油管的视频,标题:Onda V891 - Root Android 4.4.4 (Kit Kat) 2)下载工具,照着做就行了. 3)root完之后,安装 [钛备份](TitaniumBacku ...
- maven---->配置,指令,插件,使用
maven是用于java的自动化构建工具. 1.下载:http://maven.apache.org/download.cgi 下载下面截图标红处的文件 然后直接解压可以得到文件夹,得到如下文件夹 不 ...
- String的intern()方法和java关键字、保留字
String s1 = new StringBuilder("hel").append("lo").toString(); //hello System.out ...
- Android -------- MVC,MVP 和 MVVM 架构设计模式
MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了. 一.MVC MV ...
- 数据库SQLserver(课本)
一.SQL server的部署 1.数据库的基本概念 数据库通常是一个由行和列组成的二维表 数据表中的行通常叫做记录或元祖 数据表中的列通常叫做字段或属性 2.主键和外键 主键:定义主键可以保证数据的 ...