python3:线程管理进程
1、主线程启动/停止子线程
2、子线程拉起/停止工作的进程,并负责信息记录
#!/usr/bin/env python
# -*- coding: utf-8 -*-""""""
import os
import subprocess
import threading
import timeclass CmdThread(threading.Thread):def __init__(self):super().__init__()self._stop_event = threading.Event()self._proc = Nonedef run(self):# 运行命令(例如 ping)process = subprocess.Popen(['ping', 'www.baidu.com'],shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True)while True:if self._stop_event.is_set():process.terminate()# 等待命令执行完成并获取返回码return_code = process.wait()print(f"命令返回码: {return_code}")breakreturn_code = process.poll()if return_code is not None:print(f"命令返回码: {return_code}")breakline = process.stdout.readline()if not line:time.sleep(0.5)thread = threading.current_thread()print(time.strftime("%H:%M:%S"), f"子线程<{os.getpid()}-{thread.ident}>正在运行...")print(f"输出<{process.pid}>: {line.strip()}", process.poll())thread = threading.current_thread()print(time.strftime("%H:%M:%S"), f"子线程<{os.getpid()}-{thread.ident}>已停止")def stop(self):self._stop_event.set()class ManageServer:def __init__(self):self._child_thread = [CmdThread(), CmdThread()]def start_all_servers(self):for child in self._child_thread:child.start()# 主线程执行其他操作for i in range(10):thread = threading.current_thread()print(time.strftime("%H:%M:%S"), f"主线程<{os.getpid()}-{thread.ident}>", i)time.sleep(5)print(time.strftime("%H:%M:%S"), f"所有子线程启动完毕!!")def stop_all_servers(self):for child in self._child_thread:child.stop()for child in self._child_thread:child.join()print(time.strftime("%H:%M:%S"), f"所有子线程已结束")def main_run():"""主函数"""ms = ManageServer()try:ms.start_all_servers()except KeyboardInterrupt:# 停止线程ms.stop_all_servers()print("主线程已结束")if __name__ == "__main__":main_run()