optimize stop
Browse files- owl/webapp_zh.py +22 -47
owl/webapp_zh.py
CHANGED
@@ -248,56 +248,32 @@ def validate_input(question: str) -> bool:
|
|
248 |
|
249 |
# 终止运行进程的函数
|
250 |
def terminate_process():
|
251 |
-
"""
|
252 |
global CURRENT_PROCESS, STOP_REQUESTED
|
253 |
|
254 |
if CURRENT_PROCESS is None:
|
255 |
-
logging.info("
|
256 |
-
return "
|
257 |
|
258 |
try:
|
259 |
STOP_REQUESTED.set() # 设置停止标志
|
260 |
-
logging.info("
|
261 |
|
262 |
-
#
|
263 |
-
current_os = platform.system()
|
264 |
-
|
265 |
-
if current_os == "Windows":
|
266 |
-
# Windows平台使用taskkill强制终止进程树
|
267 |
-
if hasattr(CURRENT_PROCESS, 'pid'):
|
268 |
-
subprocess.run(f"taskkill /F /T /PID {CURRENT_PROCESS.pid}", shell=True)
|
269 |
-
logging.info(f"已发送Windows终止命令到进程 {CURRENT_PROCESS.pid}")
|
270 |
-
else:
|
271 |
-
# Unix-like系统 (Linux, macOS)
|
272 |
-
if hasattr(CURRENT_PROCESS, 'pid'):
|
273 |
-
# 发送SIGTERM信号
|
274 |
-
os.killpg(os.getpgid(CURRENT_PROCESS.pid), signal.SIGTERM)
|
275 |
-
logging.info(f"已发送SIGTERM信号到进程组 {CURRENT_PROCESS.pid}")
|
276 |
-
|
277 |
-
# 给进程一些时间来清理
|
278 |
-
time.sleep(0.5)
|
279 |
-
|
280 |
-
# 如果进程仍在运行,发送SIGKILL
|
281 |
-
try:
|
282 |
-
if CURRENT_PROCESS.poll() is None:
|
283 |
-
os.killpg(os.getpgid(CURRENT_PROCESS.pid), signal.SIGKILL)
|
284 |
-
logging.info(f"已发送SIGKILL信号到进程组 {CURRENT_PROCESS.pid}")
|
285 |
-
except (ProcessLookupError, OSError):
|
286 |
-
pass # 进程可能已经终止
|
287 |
-
|
288 |
-
# 如果是线程,尝试终止线程
|
289 |
if isinstance(CURRENT_PROCESS, threading.Thread) and CURRENT_PROCESS.is_alive():
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
|
|
|
|
297 |
|
298 |
except Exception as e:
|
299 |
-
logging.error(f"
|
300 |
-
return f"
|
301 |
|
302 |
def run_owl(question: str, example_module: str) -> Tuple[str, List[List[str]], str, str]:
|
303 |
"""运行OWL系统并返回结果
|
@@ -577,6 +553,9 @@ def create_ui():
|
|
577 |
"""处理问题并实时更新日志和对话历史"""
|
578 |
global CURRENT_PROCESS, STOP_REQUESTED, CONVERSATION_UPDATE_QUEUE
|
579 |
|
|
|
|
|
|
|
580 |
# 创建一个后台线程来处理问题
|
581 |
result_queue = queue.Queue()
|
582 |
# 创建一个队列用于实时更新对话历史
|
@@ -696,7 +675,7 @@ def create_ui():
|
|
696 |
# 检查是否已请求停止
|
697 |
if STOP_REQUESTED.is_set():
|
698 |
logs = get_latest_logs(100)
|
699 |
-
yield
|
700 |
break
|
701 |
|
702 |
# 检查是否有新的对话更新(从日志解析)
|
@@ -754,9 +733,9 @@ def create_ui():
|
|
754 |
|
755 |
# 如果已请求停止但线程仍在运行
|
756 |
if STOP_REQUESTED.is_set() and bg_thread.is_alive():
|
757 |
-
|
758 |
logs = get_latest_logs(100)
|
759 |
-
yield "
|
760 |
return
|
761 |
|
762 |
# 处理完成,获取结果
|
@@ -1179,8 +1158,6 @@ def main():
|
|
1179 |
global STOP_LOG_THREAD, STOP_REQUESTED
|
1180 |
STOP_LOG_THREAD.set()
|
1181 |
STOP_REQUESTED.set()
|
1182 |
-
# 尝试终止当前进程
|
1183 |
-
terminate_process()
|
1184 |
logging.info("应用程序关闭,停止日志线程")
|
1185 |
|
1186 |
app.launch(share=False,enable_queue=True,server_name="127.0.0.1",server_port=7860)
|
@@ -1194,8 +1171,6 @@ def main():
|
|
1194 |
# 确保日志线程停止
|
1195 |
STOP_LOG_THREAD.set()
|
1196 |
STOP_REQUESTED.set()
|
1197 |
-
# 尝试终止当前进程
|
1198 |
-
terminate_process()
|
1199 |
logging.info("应用程序关闭")
|
1200 |
|
1201 |
if __name__ == "__main__":
|
|
|
248 |
|
249 |
# 终止运行进程的函数
|
250 |
def terminate_process():
|
251 |
+
"""停止当前运行的线程,而不是终止整个进程"""
|
252 |
global CURRENT_PROCESS, STOP_REQUESTED
|
253 |
|
254 |
if CURRENT_PROCESS is None:
|
255 |
+
logging.info("没有正在运行的线程")
|
256 |
+
return "没有正在运行的线程", "<span class='status-indicator status-success'></span> 已就绪"
|
257 |
|
258 |
try:
|
259 |
STOP_REQUESTED.set() # 设置停止标志
|
260 |
+
logging.info("已设置停止标志,正在等待线程响应...")
|
261 |
|
262 |
+
# 如果是线程,只需要设置标志让它自行停止
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
if isinstance(CURRENT_PROCESS, threading.Thread) and CURRENT_PROCESS.is_alive():
|
264 |
+
logging.info("等待线程处理停止请求...")
|
265 |
+
# 不强制终止线程,只设置标志位让线程自行退出
|
266 |
+
# 线程应该会定期检查STOP_REQUESTED标志
|
267 |
+
return "已请求停止生成", "<span class='status-indicator status-warning'></span> 正在停止..."
|
268 |
+
else:
|
269 |
+
# 如果不是线程或线程已经不活跃,则重置状态
|
270 |
+
CURRENT_PROCESS = None
|
271 |
+
logging.info("线程已不活跃")
|
272 |
+
return "线程已停止", "<span class='status-indicator status-success'></span> 已就绪"
|
273 |
|
274 |
except Exception as e:
|
275 |
+
logging.error(f"停止线程时出错: {str(e)}")
|
276 |
+
return f"停止线程时出错: {str(e)}", f"<span class='status-indicator status-error'></span> 错误: {str(e)}"
|
277 |
|
278 |
def run_owl(question: str, example_module: str) -> Tuple[str, List[List[str]], str, str]:
|
279 |
"""运行OWL系统并返回结果
|
|
|
553 |
"""处理问题并实时更新日志和对话历史"""
|
554 |
global CURRENT_PROCESS, STOP_REQUESTED, CONVERSATION_UPDATE_QUEUE
|
555 |
|
556 |
+
# 重置停止标志
|
557 |
+
STOP_REQUESTED.clear()
|
558 |
+
|
559 |
# 创建一个后台线程来处理问题
|
560 |
result_queue = queue.Queue()
|
561 |
# 创建一个队列用于实时更新对话历史
|
|
|
675 |
# 检查是否已请求停止
|
676 |
if STOP_REQUESTED.is_set():
|
677 |
logs = get_latest_logs(100)
|
678 |
+
yield "操作已取消", current_chat_history, "0", "<span class='status-indicator status-warning'></span> 正在停止...", logs
|
679 |
break
|
680 |
|
681 |
# 检查是否有新的对话更新(从日志解析)
|
|
|
733 |
|
734 |
# 如果已请求停止但线程仍在运行
|
735 |
if STOP_REQUESTED.is_set() and bg_thread.is_alive():
|
736 |
+
# 不再强制join线程��让它自然结束
|
737 |
logs = get_latest_logs(100)
|
738 |
+
yield "生成已停止", current_chat_history, "0", "<span class='status-indicator status-warning'></span> 已停止生成", logs
|
739 |
return
|
740 |
|
741 |
# 处理完成,获取结果
|
|
|
1158 |
global STOP_LOG_THREAD, STOP_REQUESTED
|
1159 |
STOP_LOG_THREAD.set()
|
1160 |
STOP_REQUESTED.set()
|
|
|
|
|
1161 |
logging.info("应用程序关闭,停止日志线程")
|
1162 |
|
1163 |
app.launch(share=False,enable_queue=True,server_name="127.0.0.1",server_port=7860)
|
|
|
1171 |
# 确保日志线程停止
|
1172 |
STOP_LOG_THREAD.set()
|
1173 |
STOP_REQUESTED.set()
|
|
|
|
|
1174 |
logging.info("应用程序关闭")
|
1175 |
|
1176 |
if __name__ == "__main__":
|