python 多线程伪_关于多线程和多进程

本文总结了Python中的多线程、多进程和协程的概念及其区别。线程是CPU调度的最小单位,发生异常不影响其他线程;进程间通过共享内存通信。在面临选择多线程还是多进程时,需要考虑资源利用和同步问题。多线程可能引发竞争条件,解决方法包括使用锁,但锁可能导致活锁和死锁。Python的多线程在GIL限制下并非真正的并行执行。文章最后提出了死锁的产生原因及避免策略,并表示会继续补充相关内容。
摘要由CSDN通过智能技术生成

0ae475dcc867ff4907dd64608b6e07f8.png

最近面试的时候吗,经常被问到多线程和多进程和协程之间的区别,每次这个问题都可以回答很长一段时间,这里统一总结下, 以下下次面试时能够从容回答。

什么是多线程:

线程是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锁

暂时总结这么些,有时间继续补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值