1、主线程启动/停止子线程
2、子线程拉起/停止工作的进程,并负责信息记录
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
"""
import os
import subprocess
import threading
import time
class CmdThread(threading.Thread):
def __init__(self):
super().__init__()
self._stop_event = threading.Event()
self._proc = None
def 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}")
break
return_code = process.poll()
if return_code is not None:
print(f"命令返回码: {return_code}")
break
line = 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()