Python中进程 线程 协程 锁 的各种问题大揭秘,面试12个问题大总结..

任何计算机语言都离不开进程线程以及协程的话题,那么今天我们来聊聊Python的进程,线程以及协程是怎么样运行的,以及锁结构的各种类型,还有最重要的是解密各种遇到的问题!!!

那么下面咱们就直入正题吧!

1. 谈谈对多进程多线程以及协程的理解

进程: 一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大.

线程: 调度执行的最小单位,也叫执行路径,不能独立存在, 依赖进程存在. 一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率.

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快

  1. 什么是多线程竞争?

线程是独立的,同一个进程里线程是数据共享的,当各个线程访问数据资源时会出现竞争状态即:数据几乎同步会被多个线程占用,造成数据混乱,即所谓的线程不安全

那么怎么解决多线程竞争问题? —锁

锁的好处:

确保了某段关键代码(共享数据资源)只能由一个线程从头到尾完整地执行能解决多线程资源竞争下的原子操作问题.

锁的坏处:

阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了

锁的致命问题:死锁

  1. 什么是锁?有哪几种锁?

锁(Lock)是Python提供的对线程控制的对象,有互斥锁,可重入锁,死锁.

  1. 什么是死锁?

若干子线程在资源竞争时,都在等待对方对某部分资源解除占用状态,结果是谁也不愿先解锁,互相干等着,程序无法执行下去,这就是死锁.

  1. GIL锁,全局解释器锁(只有在cpython里才有)

作用: 限制多线程同时执行,保证同一时间只有一个线程执行,所以cpython里的多线程其实是伪多线程

所以Python里常常使用协程技术来代替多线程,协程是一种更轻量级的线程.

进程和线程的切换是由系统决定的,而协程由我们程序员自己决定,而模块gevent下切换是遇到了耗时操作才会切换

三者的关系: 进程里有线程,线程里有协程.

  1. 什么是线程安全?什么是互斥锁?

每个对象有对应于一个可称为"互斥锁"的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象.

同一个进行中的多线程是共享系统资源的, 多个线程同时对一个对象进行操作,一个线程操作尚未结束,另一个线程已经对其进行操作,导致最终结果出现错误,此时需要对被操作对象添加互斥锁,保证每个线程对该对象的操作都得到正确的结果.

7.说说下面几个概念:同步,异步, 非阻塞?

同步: 多个任务之间有先后顺序执行,一个执行完下个才能执行.

异步:多个任务之间没有先后顺序,可以同时执行 有时候一个任务可能在必要的时候获取另一个同时执行的任务的结果,这就叫回调!

阻塞: 如果卡住了调用者,调用者不能继续往下执行,就是说调用者阻塞了

非阻塞:如果不会卡住, 可以继续执行,就是说非阻塞的

同步异步相对于多任务而言,阻塞非阻塞相对于代码执行而言

  1. 什么是僵尸进程和孤儿进程?怎么避免僵尸进程?

孤儿进程: 父进程退出, 子进程还在运行的这些子进程都是孤儿进程, 孤儿进程将被init进程(进程号为1)所收养, 并由init进程对他们完成状态收集工作.

僵尸进程:进程使用fork创建子进程, 如果子进程退出, 而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程

避免僵尸进程的方法:

1. fork 两次用孙子进程去完成子进程的任务;

2. 用wait()函数使父进程阻塞

3. 使用信号量, 在signal handler 中调用waitpid, 这样父进程不用阻塞.

  1. Python中的进程与线程的使用场景?

多进程适合在CPU密集型操作(CPU指令比较多, 如位数多的浮点运算).

多线程适合在IO密集型操作(读写数据操作较多的, 比如爬虫)

  1. 线程是并发还是并行?进程是并发还是并行?

线程是并发, 进程是并行;

进程之间相互独立, 是系统分配资源的最小单位, 同一个进程中的所有线程共享资源.

  1. 并发(parallel) 和并发(concurrency)?

并行: 同一时刻多个任务同时在运行.

并发:在同一时间间隔内多个任务都在运行, 但是并不会在同一时刻同时运行, 存在交替执行的情况

实现并行的库有: multiprocessing

实现并发的库有:threading

程序需要执行较多的读写,请求和回复任务的需要大量的IO操作, IO密集型操作使用并发更好.

CPU运算量大的程序, 使用并行会更好.

  1. IO密集型和CPU密集型的区别?

IO密集型: 系统运作, 大部分的情况是CPU在对I/O(硬盘/内存)的读/写

CPU密集型: 大部分时间用来做计算, 逻辑判断等CPU动作的程序称为CPU密集型

————————————————
版权声明:本文为CSDN博主「z_xiaochuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/z_xiaochuan/article/details/84452415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值