赞
踩
最近面试的时候吗,经常被问到多线程和多进程和协程之间的区别,每次这个问题都可以回答很长一段时间,这里统一总结下, 以下下次面试时能够从容回答。
什么是多线程:
线程是CPU调度的最小单位,是执行进程中的路径。线程是独立的,如果在一个线程中发生异常,不会影响其他线程;进程使用共享内存区域。
什么是多进程:
- 进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程,
- 我们运行的一个py脚本就是一个进程。每个进程都有自己独立的地址空间(内存空间),
- 每当用户启动一个进程时,操作系统就会为该系统分配一个独立的内存空间,让应用程序
- 在这个独立的内存空间中运行。
什么是协程:
- 是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。
- 协程调用切换时,将寄存器上下文和栈保存到其他地方,再切回来的时候,恢复先前保存的寄存器上下文和栈,
- 直接操作栈则没有内核切换的开销,可以不加锁的访问全局的变量,所以上下文切换非常快。
那么什么时候选择时候多线程什么时候使用多进程呢?
一般回答CPU密集型使用多进程,IP密集型使用多线程即可。
在使用多线程的时候会出现什么问题吗?
- 在使用多线程的时候会出现多线程竞争
- 多线程竞争是因为线程是非独立的,同一个进程中线程是数据共享的,
- 当各个线程访问数据资源时会出现竞争状态,
- 即:数据几乎同步被多个线程占用,造成数据混乱,即多为的线程不安全。
怎么解决多线程竞争问题?
- 线程同步能保证多个线程安全访问竞争资源,最简单的同步机制死引入互斥锁
- 互斥锁为资源银土一个状态:锁定/非锁定
- 某个线程要更改为共享数据时,先将其锁定,此时资源的状态为"锁定",其他线程不能更改;
- 直到该线程释放资源,将资源的状态变成"非锁定",其他的线程才能再次锁定该资源。
- 互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
使用了锁之后,会出现哪些坏处和好处?
- 锁的好处:
- 确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行
- 能解决多线程资源竞争下的原子操作问题。
- 锁的坏处:
- 阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率大大地降低了。
- 锁的致命问题:
- 死锁
死锁产生的原因以及如何避免
- 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
- 避免死锁:
- 程序设计要尽量避免(银行家算法)
- 添加超时时间等
Python中的多线程是真实的多线程么?
- python中的多线程是伪多线程,因为存在GIL。
- 1、Python语言和GIL没有关系,只是因为历史原因在Cpython虚拟机(解释器)中难以移除GIL
- 2、GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。
- 3、线程释放GIL锁的情况:在IO操作等可能引起阻塞的system call之前,可以暂时释放GIL,
- 但在执行完毕后,必须重新获取GIL,python3使用计时器(执行时间到达阈值后,当前线程释放GIL)
- 或python2,tickets计数达到100
- 4、Python使用多进程是可以利用多核CPU资源的
- 5、多线程爬虫比单线程性能有提升,是因为IO阻塞会自动释放GIL锁
暂时总结这么些,有时间继续补充。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。