如何在Windows系统上用Python快速终止所有正在运行的进程
Windows环境下Python快速批量终止进程的实现方案
首先说明原方案的问题:Windows平台的os.kill实现逻辑与Linux不同,默认发送的信号无法穿透explorer等带自我保护机制的进程的防护,必须使用强制终止逻辑才能生效。
方案1:异步调用taskkill
针对单任务调用taskkill过慢的问题,可以使用concurrent.futures.ThreadPoolExecutor实现多线程异步调用,子进程调用属于IO密集型操作,多线程可以大幅降低总耗时:
import subprocess from concurrent.futures import ThreadPoolExecutor # 原有获取PID的函数,增加异常兼容 def processes(): subp = subprocess.Popen(["tasklist", "/FO", "CSV", "/NH"], stdout=subprocess.PIPE, stderr=subprocess.DEVNULL) processes_from_command = subp.stdout.read().decode("ISO-8859-1") subp.terminate() for row in processes_from_command.split("\n"): row = row.strip() if not row: continue try: yield int(row.split(",")[1].replace("\"", "")) except (IndexError, ValueError): continue # 单个PID终止函数 def kill_single_pid(pid): # /F参数表示强制终止,可解决无法杀掉explorer的问题 subprocess.run( ["taskkill", "/F", "/PID", str(pid)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL ) if __name__ == "__main__": pid_list = list(processes()) # 线程数可根据实际运行效果调整 with ThreadPoolExecutor(max_workers=20) as executor: executor.map(kill_single_pid, pid_list)
方案2:批量taskkill(优先推荐)
taskkill本身支持一次性传入多个PID参数,仅需调用1次子进程即可完成所有进程终止,无多线程额外开销,实现最简单速度最快:
if __name__ == "__main__": pid_list = list(processes()) # 构造批量终止命令 cmd = ["taskkill", "/F"] for pid in pid_list: cmd.extend(["/PID", str(pid)]) subprocess.run(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
方案3:调用原生Win32 API(最高性能)
如果不想依赖外部命令,可以通过ctypes直接调用Windows系统API终止进程,没有子进程创建开销,性能最高:
import ctypes import ctypes.wintypes kernel32 = ctypes.WinDLL('kernel32', use_last_error=True) PROCESS_TERMINATE = 0x0001 def kill_pid_by_api(pid): h_process = kernel32.OpenProcess(PROCESS_TERMINATE, False, pid) if not h_process: return kernel32.TerminateProcess(h_process, 0) kernel32.CloseHandle(h_process) if __name__ == "__main__": for pid in processes(): try: kill_pid_by_api(pid) except Exception: pass
注意事项
- 终止系统核心进程会导致系统崩溃、自动重启,执行前建议先过滤掉svchost.exe、lsass.exe等系统关键进程的PID
- 强制终止进程不会给进程留出数据保存的时间,可能导致未保存的数据丢失
内容的提问来源于stack exchange,提问作者Robiot
相关产品推荐
相关产品推荐

