Python高频面试题之进程篇

739 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

前言

进程、线程、协程,这些都是后端同学熟悉的概念。可能大部分的代码开发都很少用到这方面的知识,但是我们得熟悉这些概念和区别,这样在面试中才能谈笑风生,技能进阶这一块也是必不可少的。看看下面这些常规题你熟悉多少吧。

1. 说说对多进程、多线程和协程的理解

答:多进程、多线程及协程都是为了提高代码的执行效率而使用的,它们的定义是这样的:

  • 进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最

小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。

  • 线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个

线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。

但在python中因为GIL锁的原因,同一时间一个进程只有一个线程能拿到GIL锁,因此多线程其实为伪多线程。

  • 协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和

栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存

器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切

换非常快。

总结来说,在Python中,多线程长用于IO密集型的操作,比如数据读写、网络爬虫等;多进程常用于CPU密集型的操作,比如大量的计算任务;而协程多用于支撑高并发I/O的场景,比如tornado和gevent都实现了协程功能。

2. 多线程竞争了解吗?

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

要解决多线程竞争问题,我们就要用到 锁。

  • 锁的优点:

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

  • 锁的缺点:

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

3. 什么是多线程死锁?

答: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象。我们在使用多线程锁的时候一定要注意:使用互斥锁的时候要在合适的地方注意释放锁。

4. GIL锁了解多少?

答:GIL锁是CPython解释器的锁机制。它是为了线程安全设计的,旨在同一时间一个进程下,只有一个线程能拿到GIL锁。因此使用CPython解释器的Python多线程其实是伪多线程。

5. 说说同步、异步、阻塞和非阻塞的概念

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

  • 同步:多个任务之间有先后顺序执行,一个执行完下个才能执行。
  • 异步:多个任务之间没有先后顺序,一个任务没执行完,不会影响别的任务执行。
  • 阻塞:如果代码卡在一个地方,调用者不能继续往下执行,就是说调用者阻塞了。
  • 非阻塞:代码不会因为一处没执行完卡住,可以继续执行。

6. 线程和进程是并发还是并行?

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

小结

本文总结了Python进程相关的高频面试题,这一块概念比较多。进程知识在我们设计组件及项目开发都非常重要,我们在学习进程知识时,一定要结合案例来学习,这样才能更好的理解进程知识。