面试题答案
一键面试1. 线程池优化
线程池可以复用线程,减少线程创建和销毁的开销。在Python中,可以使用concurrent.futures
模块中的ThreadPoolExecutor
来实现线程池。
示例代码如下:
import concurrent.futures
import time
def io_bound_task():
time.sleep(1) # 模拟I/O操作
return "Task completed"
if __name__ == '__main__':
start_time = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
tasks = [executor.submit(io_bound_task) for _ in range(20)]
for future in concurrent.futures.as_completed(tasks):
print(future.result())
end_time = time.time()
print(f"Total time: {end_time - start_time} seconds")
2. 异步I/O优化
Python的asyncio
库提供了异步I/O的支持。通过使用async
和await
关键字,可以将I/O操作异步化,避免线程阻塞。
示例代码如下:
import asyncio
import time
async def io_bound_task():
await asyncio.sleep(1) # 模拟异步I/O操作
return "Task completed"
async def main():
tasks = [io_bound_task() for _ in range(20)]
results = await asyncio.gather(*tasks)
for result in results:
print(result)
if __name__ == '__main__':
start_time = time.time()
asyncio.run(main())
end_time = time.time()
print(f"Total time: {end_time - start_time} seconds")
3. 对比分析
- 线程池:适用于I/O密集型任务,它可以控制并发线程的数量,避免过多线程导致的资源消耗。通过复用线程,减少了线程创建和销毁的开销。
- 异步I/O:在单线程内通过事件循环来处理异步操作,完全避免了线程切换的开销,在I/O密集型任务上性能通常比线程池更好。但它需要将代码改写成异步风格,对代码结构有一定的侵入性。
在实际应用中,可以根据具体的场景和代码结构选择合适的优化方式。如果代码已经是基于线程的,使用线程池进行优化较为方便;如果是全新开发或对性能要求极高,可以考虑使用异步I/O。