朱东升 commited on
Commit
7f83e08
·
1 Parent(s): 5922648
Files changed (1) hide show
  1. app.py +44 -6
app.py CHANGED
@@ -20,13 +20,18 @@ if current_dir not in sys.path:
20
  if src_dir not in sys.path:
21
  sys.path.append(src_dir)
22
 
23
- # 创建全局任务队列和任务状态跟踪
24
  task_queue = queue.Queue()
25
  task_results = {}
26
  active_tasks = {}
27
  completed_tasks = []
28
  task_id_counter = 0
29
  task_lock = threading.Lock()
 
 
 
 
 
30
 
31
  def get_next_task_id():
32
  global task_id_counter
@@ -61,6 +66,9 @@ def submit_task(input_data):
61
  active_tasks[task_id] = task_info
62
  task_queue.put(task_info)
63
 
 
 
 
64
  # 如果这是第一个任务,启动处理线程
65
  if len(active_tasks) == 1:
66
  threading.Thread(target=process_task_queue, daemon=True).start()
@@ -108,6 +116,7 @@ def process_task_queue():
108
  # 更新任务状态
109
  with task_lock:
110
  active_tasks[task_id]["status"] = "processing"
 
111
 
112
  # 处理任务
113
  result = evaluate(task_info["data"])
@@ -125,11 +134,26 @@ def process_task_queue():
125
  # 保留最近的20个已完成任务
126
  if len(completed_tasks) > 20:
127
  completed_tasks.pop(0)
 
 
128
 
129
  task_queue.task_done()
130
 
131
  except Exception as e:
132
  print(f"Error processing task queue: {str(e)}")
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  time.sleep(1)
134
 
135
  def evaluate(input_data):
@@ -380,6 +404,13 @@ def refresh_ui():
380
  """定期刷新UI函数"""
381
  return render_queue_status()
382
 
 
 
 
 
 
 
 
383
  def submit_json_data(json_data):
384
  """提交JSON数据处理接口"""
385
  try:
@@ -390,9 +421,12 @@ def submit_json_data(json_data):
390
  data = json_data
391
 
392
  result = submit_task(data)
393
- return json.dumps(result, ensure_ascii=False, indent=2)
 
 
 
394
  except Exception as e:
395
- return json.dumps({"status": "error", "message": str(e)}, ensure_ascii=False, indent=2)
396
 
397
  # 创建Gradio接口
398
  with gr.Blocks(title="代码评估服务", theme=gr.themes.Soft()) as demo:
@@ -405,10 +439,14 @@ with gr.Blocks(title="代码评估服务", theme=gr.themes.Soft()) as demo:
405
  status_html = gr.HTML(render_queue_status)
406
  refresh_button = gr.Button("刷新状态")
407
  refresh_button.click(fn=refresh_ui, outputs=status_html)
408
- # 使用JavaScript实现自动刷新,代替不兼容的every参数
 
 
 
 
409
  gr.HTML("""
410
  <script>
411
- // 使用JavaScript实现自动刷新
412
  function setupAutoRefresh() {
413
  const refreshInterval = 5000; // 5秒
414
 
@@ -447,7 +485,7 @@ with gr.Blocks(title="代码评估服务", theme=gr.themes.Soft()) as demo:
447
  with gr.Column():
448
  result_output = gr.Textbox(label="提交结果", lines=5)
449
 
450
- submit_button.click(fn=submit_json_data, inputs=json_input, outputs=result_output)
451
 
452
  with gr.Tab("API文档"):
453
  gr.Markdown("""
 
20
  if src_dir not in sys.path:
21
  sys.path.append(src_dir)
22
 
23
+ # 添加全局任务队列和任务状态跟踪
24
  task_queue = queue.Queue()
25
  task_results = {}
26
  active_tasks = {}
27
  completed_tasks = []
28
  task_id_counter = 0
29
  task_lock = threading.Lock()
30
+ update_event = threading.Event() # 通知UI需要刷新
31
+
32
+ def trigger_ui_update():
33
+ """触发UI更新事件"""
34
+ update_event.set()
35
 
36
  def get_next_task_id():
37
  global task_id_counter
 
66
  active_tasks[task_id] = task_info
67
  task_queue.put(task_info)
68
 
69
+ # 触发UI更新
70
+ trigger_ui_update()
71
+
72
  # 如果这是第一个任务,启动处理线程
73
  if len(active_tasks) == 1:
74
  threading.Thread(target=process_task_queue, daemon=True).start()
 
116
  # 更新任务状态
117
  with task_lock:
118
  active_tasks[task_id]["status"] = "processing"
119
+ trigger_ui_update() # 状态变更为处理中时更新UI
120
 
121
  # 处理任务
122
  result = evaluate(task_info["data"])
 
134
  # 保留最近的20个已完成任务
135
  if len(completed_tasks) > 20:
136
  completed_tasks.pop(0)
137
+
138
+ trigger_ui_update() # 任务完成时更新UI
139
 
140
  task_queue.task_done()
141
 
142
  except Exception as e:
143
  print(f"Error processing task queue: {str(e)}")
144
+ # 出错时也触发UI更新
145
+ with task_lock:
146
+ if task_id in active_tasks:
147
+ active_tasks[task_id]["status"] = "error"
148
+ active_tasks[task_id]["error"] = str(e)
149
+ active_tasks[task_id]["completed_at"] = datetime.now()
150
+ # 将任务移至已完成列表
151
+ completed_tasks.append(active_tasks[task_id])
152
+ del active_tasks[task_id]
153
+ # 保留最近的20个已完成任务
154
+ if len(completed_tasks) > 20:
155
+ completed_tasks.pop(0)
156
+ trigger_ui_update()
157
  time.sleep(1)
158
 
159
  def evaluate(input_data):
 
404
  """定期刷新UI函数"""
405
  return render_queue_status()
406
 
407
+ def check_for_updates():
408
+ """检查是否有UI更新请求"""
409
+ if update_event.is_set():
410
+ update_event.clear()
411
+ return render_queue_status()
412
+ return gr.update()
413
+
414
  def submit_json_data(json_data):
415
  """提交JSON数据处理接口"""
416
  try:
 
421
  data = json_data
422
 
423
  result = submit_task(data)
424
+ response = json.dumps(result, ensure_ascii=False, indent=2)
425
+
426
+ # 返回任务提交结果和最新的队列状态
427
+ return response, render_queue_status()
428
  except Exception as e:
429
+ return json.dumps({"status": "error", "message": str(e)}, ensure_ascii=False, indent=2), render_queue_status()
430
 
431
  # 创建Gradio接口
432
  with gr.Blocks(title="代码评估服务", theme=gr.themes.Soft()) as demo:
 
439
  status_html = gr.HTML(render_queue_status)
440
  refresh_button = gr.Button("刷新状态")
441
  refresh_button.click(fn=refresh_ui, outputs=status_html)
442
+
443
+ # 设置自动刷新 - 使用Gradio内置的轮询功能
444
+ demo.load(check_for_updates, None, status_html, every=1)
445
+
446
+ # JavaScript刷新功能保留作为备份
447
  gr.HTML("""
448
  <script>
449
+ // 使用JavaScript作为备份的自动刷新
450
  function setupAutoRefresh() {
451
  const refreshInterval = 5000; // 5秒
452
 
 
485
  with gr.Column():
486
  result_output = gr.Textbox(label="提交结果", lines=5)
487
 
488
+ submit_button.click(fn=submit_json_data, inputs=json_input, outputs=[result_output, status_html])
489
 
490
  with gr.Tab("API文档"):
491
  gr.Markdown("""