面试题答案
一键面试思路
- I/O密集型任务:Python的多线程在I/O密集型任务中表现良好,因为在I/O操作时,线程会释放GIL(全局解释器锁),允许其他线程执行。所以对于大量I/O操作,如文件读写、网络请求等,可以使用多线程来处理。
- CPU密集型任务:多进程可以绕过GIL的限制,每个进程有自己独立的Python解释器和内存空间,适用于CPU密集型任务。例如复杂的数学计算、数据处理算法等。
举例
假设我们有一个项目,需要从多个文件中读取数据,然后对这些数据进行复杂的计算。
import concurrent.futures
import time
# I/O密集型任务函数
def io_bound_task(file_path):
with open(file_path, 'r') as f:
data = f.read()
return data
# CPU密集型任务函数
def cpu_bound_task(data):
result = 0
for char in data:
result += ord(char)
return result
if __name__ == '__main__':
file_paths = ['file1.txt', 'file2.txt', 'file3.txt']
# 使用多线程处理I/O密集型任务
with concurrent.futures.ThreadPoolExecutor() as thread_executor:
io_results = list(thread_executor.map(io_bound_task, file_paths))
# 使用多进程处理CPU密集型任务
with concurrent.futures.ProcessPoolExecutor() as process_executor:
cpu_results = list(process_executor.map(cpu_bound_task, io_results))
print(cpu_results)
在上述代码中:
- 首先使用
ThreadPoolExecutor
创建一个线程池,通过map
方法并行执行io_bound_task
,该任务从文件中读取数据,属于I/O密集型操作。 - 然后使用
ProcessPoolExecutor
创建一个进程池,通过map
方法并行执行cpu_bound_task
,该任务对读取到的数据进行复杂计算,属于CPU密集型操作。
通过这种方式,合理结合多线程和多进程,提高项目整体性能。