From e57a885633d799f0fc0062fd38c721b60351dc2e Mon Sep 17 00:00:00 2001 From: hexiaonan-800 Date: Tue, 20 Oct 2026 11:14:07 +0800 Subject: [PATCH] feat: Introduce thread pool to handle done and cancel events --- apps/common/utils/thread_pool.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 apps/common/utils/thread_pool.py diff --git a/apps/common/utils/thread_pool.py b/apps/common/utils/thread_pool.py new file mode 100644 index 00000000000..1e2252bc1c1 --- /dev/null +++ b/apps/common/utils/thread_pool.py @@ -0,0 +1,32 @@ +# coding=utf-8 +""" +@project: MaxKB +@Author: 虎虎虎 +@file: thread_pool.py +@date: 2026/10/20 +@desc: 线程层"业务完成 vs 取消"并发等待工具 +""" + +from concurrent.futures import FIRST_COMPLETED, ThreadPoolExecutor, wait + + +def await_complete_or_cancel(done_event, cancel_event, on_cancel): + """ + 线程层并发等待"业务完成(done_event)"与"取消信号(cancel_event)"任一先到 + :parma done_event: 完成事件 + :param cancel_event: 中断事件 + :param on_cancel: 对应的取消函数 + :return:是否取消 + """ + + ex = ThreadPoolExecutor(max_workers=2) + try: + f_done = ex.submit(done_event.wait) + f_cancel = ex.submit(cancel_event.wait) + wait({f_done, f_cancel}, return_when=FIRST_COMPLETED) + finally: + ex.shutdown(wait=False) + if cancel_event.is_set(): + on_cancel() + return True + return False