面试题答案
一键面试代码实现
import threading
import csv
def read_csv_chunk(file_path, start, end, result_list):
with open(file_path, 'r') as file:
lines = file.readlines()[start:end]
for line in lines:
values = line.strip().split(',')
for value in values:
try:
result_list.append(float(value))
except ValueError:
pass
def read_csv_with_threads(file_path, num_threads=4):
result = []
file_size = sum(1 for line in open(file_path, 'r'))
chunk_size = file_size // num_threads
threads = []
for i in range(num_threads):
start = i * chunk_size
end = start + chunk_size if i < num_threads - 1 else file_size
thread = threading.Thread(target=read_csv_chunk, args=(file_path, start, end, result))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
return result
你可以使用以下方式调用这个函数:
file_path = 'your_file.csv'
result = read_csv_with_threads(file_path)
print(result)
多线程在这个场景中的优势
- 提高I/O效率:在读取CSV文件时,I/O操作通常比较耗时。多线程可以在一个线程等待I/O操作完成时,让其他线程继续处理数据,从而提高整体的I/O效率。
- 充分利用多核CPU:现代计算机通常有多核CPU,多线程可以让不同的线程运行在不同的核心上,充分利用CPU资源,加快数据处理速度。
可能遇到的问题
- 资源竞争:多个线程同时访问和修改共享的结果列表(
result_list
)时,可能会出现资源竞争问题,导致数据不一致。在上述代码中,虽然简单实现了功能,但未处理这种情况,实际应用中需要使用锁(threading.Lock
)等机制来保证数据一致性。 - 线程开销:创建和管理线程本身需要消耗一定的系统资源,如果线程数量过多,线程创建和切换的开销可能会抵消多线程带来的性能提升。
- GIL(全局解释器锁):在CPython中,由于GIL的存在,同一时刻只有一个线程能真正执行Python字节码,对于CPU密集型任务,多线程并不能充分利用多核优势,不过在I/O密集型任务(如文件读取)中影响相对较小。