面试题答案
一键面试1. 进程池(Pool)
使用multiprocessing.Pool
来管理外部进程,设置合理的进程数量。例如:
from multiprocessing import Pool
import subprocess
def run_subprocess(cmd):
subprocess.run(cmd, shell=True, check=True)
cmds = ["command1", "command2", "command3"] # 外部命令列表
with Pool(processes=4) as pool: # 设置进程池大小为4
pool.map(run_subprocess, cmds)
这样可以控制同时运行的进程数量,避免资源耗尽。
2. 资源监控与动态调整
使用psutil
等库监控系统资源(如CPU、内存),根据资源使用情况动态调整进程数量。
import psutil
import subprocess
max_processes = 4
while True:
if psutil.cpu_percent() < 80 and len(subprocess.Popen.poll() for _ in range(max_processes)) < max_processes:
subprocess.Popen("command", shell=True)
3. 优化子进程资源使用
- 减少子进程内存占用:确保子进程代码简洁,避免不必要的内存消耗,例如及时释放不再使用的变量。
- 优化I/O操作:如果子进程涉及I/O操作,使用异步I/O或批量I/O操作,减少I/O等待时间。
4. 异常处理
在启动子进程和子进程运行过程中,添加完善的异常处理机制。
try:
subprocess.run("command", shell=True, check=True)
except subprocess.CalledProcessError as e:
print(f"子进程运行出错: {e}")
这样可以及时捕获子进程运行中的错误,避免错误导致整个程序崩溃。
5. 进程复用
如果子进程执行的任务类似,可以考虑复用已有的进程,而不是频繁创建新进程。例如,使用进程间通信(如Queue
、Pipe
)将不同任务传递给复用的进程。