面试题答案
一键面试应用场景
- I/O 密集型任务:如网络请求、文件读写等。在这些场景中,线程大部分时间在等待 I/O 操作完成,而不是执行 CPU 计算。例如,当一个线程发起网络请求后,会等待服务器响应,这段时间 CPU 处于空闲状态,此时其他线程可以利用这段空闲时间执行任务,从而提高整体效率。
- 多个独立的任务:如果任务之间相互独立,不依赖彼此的计算结果,且每个任务都包含 I/O 操作,多线程可以并行处理这些任务,加快整体执行速度。
GIL 原理分析
- GIL 定义:在 CPython 解释器中,GIL 是一个全局互斥锁,它确保在任何时刻,只有一个线程可以执行 Python 字节码。这意味着即使在多核 CPU 环境下,Python 多线程也无法真正利用多核优势进行并行计算。
- 对 I/O 密集型任务影响小:对于 I/O 密集型任务,线程在等待 I/O 时会释放 GIL,其他线程就有机会获取 GIL 并执行。所以虽然 GIL 存在,但由于线程大部分时间在 I/O 等待而不是 CPU 计算,多线程仍能提高效率。
代码示例
import threading
import time
def io_bound_task():
time.sleep(1)
return
start_time = time.time()
# 单线程执行
for _ in range(5):
io_bound_task()
print(f"单线程执行时间: {time.time() - start_time} 秒")
start_time = time.time()
# 多线程执行
threads = []
for _ in range(5):
t = threading.Thread(target=io_bound_task)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"多线程执行时间: {time.time() - start_time} 秒")
在上述代码中,io_bound_task
模拟了一个 I/O 密集型任务(这里使用 time.sleep
模拟 I/O 等待)。通过对比单线程和多线程执行多个 io_bound_task
的时间,可以明显看到多线程在这种 I/O 密集型场景下的效率提升。