zjrwtx commited on
Commit
d25d044
·
1 Parent(s): 6893a36

optimize stop

Browse files
Files changed (1) hide show
  1. 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 "没有正在运行的进程", "<span class='status-indicator status-success'></span> 已就绪"
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
- logging.info("等待线程终止...")
292
- CURRENT_PROCESS.join(timeout=2)
293
-
294
- CURRENT_PROCESS = None
295
- logging.info("进程已终止")
296
- return "进程已终止", "<span class='status-indicator status-success'></span> 已就绪"
 
 
297
 
298
  except Exception as e:
299
- logging.error(f"终止进程时出错: {str(e)}")
300
- return f"终止进程时出错: {str(e)}", f"<span class='status-indicator status-error'></span> 错误: {str(e)}"
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 None, current_chat_history, None, "<span class='status-indicator status-error'></span> 正在终止...", logs
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
- bg_thread.join(timeout=2) # 等待线程最多2秒
758
  logs = get_latest_logs(100)
759
- yield "操作已取消", current_chat_history, "0", "<span class='status-indicator status-error'></span> 已终止", logs
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__":