百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 多线程高频面试题,直接把这些答案“甩在”面试官脸上

moboyou 2025-06-07 16:56 35 浏览

点赞、收藏、加关注,下次找我不迷路

不管你是刚入行的新手,还是有一定经验的开发者,掌握多线程的核心问题,都能让你在面试中脱颖而出。今天咱就来盘一盘 5 个高频的 Python 多线程面试题,用通俗易懂的语言解释,让你轻松弄懂,记得拿小本本记好哦!


一、线程和进程的区别是啥?(基础必考题)

问题抛出

考官一上来可能就会问:"说说线程和进程的区别吧。" 好多新手听到这个问题,脑子一下子就懵圈了,这俩到底啥关系,又有啥不一样呢?

白话解释

咱打个比方,把计算机比作一个大公司。进程就像是公司里的各个部门,比如研发部、销售部、财务部。每个部门都有自己独立的资源,像研发部有自己的电脑、资料、办公用品,销售部也有自己的一套东西,部门之间是相互隔离的,互不干扰。而线程呢,就好比部门里的员工。一个部门里可以有多个员工,这些员工共享部门的资源,比如同一台打印机、同一个文件服务器。员工之间可以协作完成任务,但如果协作不好,也可能会出问题,比如两个员工同时修改同一个文件,就会产生冲突。

举例说明

比如说,你同时打开了一个 Word 文档(这是一个进程)和一个浏览器(这又是一个进程)。Word 进程有自己的内存空间、文件句柄等资源,浏览器进程也有自己独立的一套。而在 Word 进程里,可能有一个线程负责显示文字,一个线程负责处理键盘输入,这两个线程共享 Word 进程的资源。

答案总结

对比项

进程

线程

定义

资源分配的最小单位

CPU 调度的最小单位

资源

独立拥有资源

共享所属进程的资源

开销

创建、销毁开销大

创建、销毁开销小

并发性

进程间并发

同一进程内线程间并发

健壮性

一个进程崩溃不影响其他进程

一个线程崩溃可能导致整个进程崩溃

记忆诀窍

"进程像部门,资源各自管;线程如员工,共享资源干。"


二、Python 里的 GIL 是啥?为啥有 GIL 还能说支持多线程?(灵魂拷问)

问题抛出

"听说过 GIL 吗?它对多线程有啥影响?为啥 Python 有 GIL 还支持多线程呢?" 这个问题可太关键了,很多人对 GIL 一知半解,面试时很容易栽跟头。

白话解释

GIL 就是全局解释器锁,说白了,就是 Python 解释器为了保证线程安全,搞的一个 "枷锁"。在同一时间,这个锁只能被一个线程持有,也就是说,即使你的电脑是多核 CPU,同一时间也只能有一个线程在执行 Python 字节码。这就好比一群人要过一个狭窄的独木桥,一次只能过一个人,其他人都得在旁边等着。那为啥 Python 还有多线程呢?虽然 GIL 限制了 CPU 密集型任务的并行执行,但对于 IO 密集型任务,比如读写文件、网络请求,线程在等待 IO 的时候,会释放 GIL,让其他线程去执行,这样就提高了效率。

举例说明

比如你有两个任务,一个是计算 1 到 1 亿的和(CPU 密集型),一个是从网上下载两个大文件(IO 密集型)。如果用多线程来执行计算任务,因为 GIL 的存在,两个线程只能轮流执行,速度并不会比单线程快多少。但如果是下载文件,当一个线程在等待网络响应时,会释放 GIL,另一个线程就可以开始下载,这样整体时间就会缩短。

答案总结

GIL 是 Python 解释器中的一个全局锁,确保同一时间只有一个线程执行字节码。对于 CPU 密集型任务,多线程由于 GIL 的存在,无法真正利用多核优势,效率可能不如单线程;对于 IO 密集型任务,线程在等待 IO 时释放 GIL,其他线程可以利用这个时间执行,从而提高效率。所以 Python 的多线程在 IO 密集型场景下是有用的,这也是它支持多线程的原因。

记忆诀窍

"GIL 是把锁,线程轮流走;CPU 任务愁,IO 任务牛。"


三、Python 中创建线程的方式有哪些?怎么用?(实操题)

问题抛出

"说说 Python 里创建线程的方法吧,最好能写个例子。" 这可是考察你实际操作能力的问题,得把步骤说清楚。

白话解释

Python 里主要有两种创建线程的方式,一种是通过 threading 模块的 Thread 类,直接创建线程对象,然后传入目标函数;另一种是继承 Thread 类,重写 run 方法,把要执行的代码放在 run 方法里。就好比你要让工人干活,一种是直接告诉工人去做某个具体的任务(目标函数),另一种是给工人定制一个专属的任务类,让他按照类里的步骤去做。

举例说明

方式一:使用 threading.Thread 创建线程

import threading
import time

# 定义目标函数
def my_task(name, seconds):
    print(f"线程{name}开始执行")
    time.sleep(seconds)
    print(f"线程{name}执行结束")

# 创建线程对象
thread1 = threading.Thread(target=my_task, args=("线程1", 2))
thread2 = threading.Thread(target=my_task, args=("线程2", 3))

# 启动线程
thread1.start()
thread2.start()

# 等待线程结束
thread1.join()
thread2.join()

方式二:继承 threading.Thread 类

import threading
import time

class MyThread(threading.Thread):
    def __init__(self, name, seconds):
        super().__init__(name=name)
        self.seconds = seconds

    def run(self):
        print(f"线程{self.name}开始执行")
        time.sleep(self.seconds)
        print(f"线程{self.name}执行结束")

# 创建线程实例
thread1 = MyThread("线程1", 2)
thread2 = MyThread("线程2", 3)

# 启动线程
thread1.start()
thread2.start()

# 等待线程结束
thread1.join()
thread2.join()

方式三:面试官问还有么?

那这家公司咱就不去了,哈哈。

答案总结

创建方式

步骤

特点

适用场景

Thread 类创建

1. 定义目标函数;

2. 创建 Thread 对象,传入目标函数和参数;

3. 调用 start () 启动线程

简单直接,适合简单任务

快速创建单个或多个独立任务线程

继承 Thread 类

1. 定义子类继承 Thread;

2. 重写 run 方法;

3. 创建子类实例,调用 start () 启动

可以封装更多线程相关的属性和方法

需要为线程定制复杂功能或维护线程状态

记忆诀窍

"创建线程两招鲜,目标函数或继承;简单任务用前者,复杂定制后者行。"


四、多线程中为什么需要线程同步?怎么实现?(重点应用题)

问题抛出

"多线程中线程同步是什么?为啥需要它?怎么实现呢?" 这涉及到多线程编程的核心难点,必须搞清楚。

白话解释

线程同步就是让多个线程按照一定的顺序执行,避免出现数据不一致的问题。比如多个线程同时修改一个共享的变量,如果不加控制,就会导致结果混乱。就像两个人同时去修改一个账本,你改一笔,我改一笔,最后账本就乱了,不知道到底哪个是正确的。这时候就需要一把 "锁",让一个线程在修改的时候,其他线程不能修改,等这个线程改完了,再释放锁,让其他线程来改。

举例说明

假设我们有一个银行账户,两个线程同时往这个账户里存钱,每次存 100 元,一共存 100 次。如果没有线程同步,可能会出现这样的情况:线程 1 读取当前余额是 0,准备加上 100;这时候线程 2 也读取当前余额是 0,也准备加上 100。然后两个线程都把余额写成 100,这样实际上只存了一次,却记录了两次,导致余额错误。加上锁之后,线程 1 在读取和修改余额的时候,锁住这个账户,线程 2 只能等待,等线程 1 改完释放锁,线程 2 再去操作,这样就不会出错了。

答案总结

线程同步是为了保证多个线程对共享资源的访问是有序的,避免数据不一致。实现线程同步的方法主要有以下几种:

  1. 锁(Lock):最基本的同步机制,获取锁的线程执行完操作后释放锁,其他线程才能获取锁。
  1. RLock(可重入锁):同一个线程可以多次获取同一个锁,避免死锁,比如在一个函数里多次调用加锁的方法。
  1. 信号量(Semaphore):控制同时访问资源的线程数量,比如限制最多 3 个线程同时访问某个文件。
  1. 事件(Event):用于线程之间的通信,一个线程设置事件,其他线程等待事件触发。

记忆诀窍

"线程同步很重要,共享资源别乱搞;锁、信号量、事件,按需选择错不了。"


五、什么是守护线程?怎么设置?有啥用?(细节题)

问题抛出

"守护线程了解吗?怎么设置?它和非守护线程有啥区别?" 这是一个考察细节的问题,很多人可能忽略这个点。

白话解释

守护线程就像是一个 "保镖" 线程,它的作用是为其他线程提供服务。当所有非守护线程都结束时,守护线程会自动终止,不管它有没有完成任务。比如你在下载文件的时候,有一个守护线程在后台监控网络连接,当下载主线程结束后,这个监控线程也会跟着结束。设置守护线程很简单,只需要在创建线程后,调用 setDaemon (True) 方法就行。

举例说明

比如我们有一个主线程,创建了一个守护线程来定期清理临时文件。当主线程运行结束后,不管清理任务有没有完成,守护线程都会被终止。如果不设置守护线程,主线程结束后,还得等待这个清理线程完成才能真正退出。

答案总结

守护线程是在后台运行的线程,用于为其他线程提供服务。设置守护线程的方法是在线程启动前调用 setDaemon (True) 或者在创建线程时传入 daemon=True 参数。守护线程的特点是:当所有非守护线程结束时,守护线程会自动终止,不会阻塞程序的退出。它的主要用途是执行一些辅助性的任务,比如日志记录、资源监控等。

记忆诀窍

"守护线程像保镖,服务他人不傲娇;主线程完它就走,设置 daemon 要记牢。"


来个对比,让你一目了然

面试题

核心考点

答案要点

记忆诀窍

线程和进程的区别

定义、资源、开销、并发性

进程资源独立,线程共享资源;进程开销大,线程开销小

进程像部门,线程如员工

GIL 是什么?为啥有 GIL 还支持多线程?

GIL 原理、对多线程的影响

GIL 是全局锁,限制 CPU 密集型任务并行;IO 密集型任务中线程等待 IO 时释放 GIL

GIL 是把锁,CPU 愁 IO 牛

创建线程的方式

Thread 类、继承 Thread 类

两种方式的步骤和特点

目标函数或继承,简单复杂各不同

线程同步

原因、实现方法

避免共享资源混乱,用锁、信号量等实现

线程同步靠锁,共享资源保护好

守护线程

定义、设置、作用

后台服务线程,随非守护线程结束而终止

守护线程像保镖,daemon 设置不能少

只要你把这些内容吃透,面试的时候肯定能对答如流。赶紧把文章收藏起来,多复习几遍,说不定下一个拿到高薪 offer 的就是你!如果还有其他 Python 问题,欢迎在评论区留言,咱们一起讨论学习!

相关推荐

Excel技巧:SHEETSNA函数一键提取所有工作表名称批量生产目录

首先介绍一下此函数:SHEETSNAME函数用于获取工作表的名称,有三个可选参数。语法:=SHEETSNAME([参照区域],[结果方向],[工作表范围])(参照区域,可选。给出参照,只返回参照单元格...

Excel HOUR函数:“小时”提取器_excel+hour函数提取器怎么用

一、函数概述HOUR函数是Excel中用于提取时间值小时部分的日期时间函数,返回0(12:00AM)到23(11:00PM)之间的整数。该函数在时间数据分析、考勤统计、日程安排等场景中应用广泛。语...

Filter+Search信息管理不再难|多条件|模糊查找|Excel函数应用

原创版权所有介绍一个信息管理系统,要求可以实现:多条件、模糊查找,手动输入的内容能去空格。先看效果,如下图动画演示这样的一个效果要怎样实现呢?本文所用函数有Filter和Search。先用filter...

FILTER函数介绍及经典用法12:FILTER+切片器的应用

EXCEL函数技巧:FILTER经典用法12。FILTER+切片器制作筛选按钮。FILTER的函数的经典用法12是用FILTER的函数和切片器制作一个筛选按钮。像左边的原始数据,右边想要制作一...

office办公应用网站推荐_office办公软件大全

以下是针对Office办公应用(Word/Excel/PPT等)的免费学习网站推荐,涵盖官方教程、综合平台及垂直领域资源,适合不同学习需求:一、官方权威资源1.微软Office官方培训...

WPS/Excel职场办公最常用的60个函数大全(含卡片),效率翻倍!

办公最常用的60个函数大全:从入门到精通,效率翻倍!在职场中,WPS/Excel几乎是每个人都离不开的工具,而函数则是其灵魂。掌握常用的函数,不仅能大幅提升工作效率,还能让你在数据处理、报表分析、自动...

收藏|查找神器Xlookup全集|一篇就够|Excel函数|图解教程

原创版权所有全程图解,方便阅读,内容比较多,请先收藏!Xlookup是Vlookup的升级函数,解决了Vlookup的所有缺点,可以完全取代Vlookup,学完本文后你将可以应对所有的查找难题,内容...

批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数

批量查询快递总耗时?用Excel这个公式,自动计算揽收到签收天数在电商运营、物流对账等工作中,经常需要统计快递“揽收到签收”的耗时——比如判断某快递公司是否符合“3天内送达”的服务承...

Excel函数公式教程(490个实例详解)

Excel函数公式教程(490个实例详解)管理层的财务人员为什么那么厉害?就是因为他们精通excel技能!财务人员在日常工作中,经常会用到Excel财务函数公式,比如财务报表分析、工资核算、库存管理等...

Excel(WPS表格)Tocol函数应用技巧案例解读,建议收藏备用!

工作中,经常需要从多个单元格区域中提取唯一值,如体育赛事报名信息中提取唯一的参赛者信息等,此时如果复制粘贴然后去重,效率就会很低。如果能合理利用Tocol函数,将会极大地提高工作效率。一、功能及语法结...

Excel中的SCAN函数公式,把计算过程理清,你就会了

Excel新版本里面,除了出现非常好用的xlookup,Filter公式之外,还更新一批自定义函数,可以像写代码一样写公式其中SCAN函数公式,也非常强大,它是一个循环函数,今天来了解这个函数公式的计...

Excel(WPS表格)中多列去重就用Tocol+Unique组合函数,简单高效

在数据的分析和处理中,“去重”一直是绕不开的话题,如果单列去重,可以使用Unique函数完成,如果多列去重,如下图:从数据信息中可以看到,每位参赛者参加了多项运动,如果想知道去重后的参赛者有多少人,该...

Excel(WPS表格)函数Groupby,聚合统计,快速提高效率!

在前期的内容中,我们讲了很多的统计函数,如Sum系列、Average系列、Count系列、Rank系列等等……但如果用一个函数实现类似数据透视表的功能,就必须用Groupby函数,按指定字段进行聚合汇...

Excel新版本,IFS函数公式,太强大了!

我们举一个工作实例,现在需要计算业务员的奖励数据,右边是公司的奖励标准:在新版本的函数公式出来之前,我们需要使用IF函数公式来解决1、IF函数公式IF函数公式由三个参数组成,IF(判断条件,对的时候返...

Excel不用函数公式数据透视表,1秒完成多列项目汇总统计

如何将这里的多组数据进行汇总统计?每组数据当中一列是不同菜品,另一列就是该菜品的销售数量。如何进行汇总统计得到所有的菜品销售数量的求和、技术、平均、最大、最小值等数据?不用函数公式和数据透视表,一秒就...