From 7c8db6adeb2606c38465283f555162a787e454d9 Mon Sep 17 00:00:00 2001 From: zhiyong Date: Fri, 16 May 2025 20:07:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=94=81,=20=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1check=5Fpending=5F?= =?UTF-8?q?orders=E5=A0=86=E7=A7=AF,=20=E4=BB=8E=E8=80=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E9=87=8D=E5=A4=8D=E6=89=A7=E8=A1=8C=E6=92=A4=E5=8D=95?= =?UTF-8?q?,=20=E8=A1=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/real/real_trader_manager.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/real/real_trader_manager.py b/src/real/real_trader_manager.py index 69a4758..1b041ac 100644 --- a/src/real/real_trader_manager.py +++ b/src/real/real_trader_manager.py @@ -44,6 +44,9 @@ class RealTraderManager: # 使用传入的trader实例,使用弱引用避免循环引用 self.trader = trader + # 初始化锁 + self._lock = threading.Lock() + # 启动调度器 self._start_scheduler() @@ -241,7 +244,12 @@ class RealTraderManager: def check_pending_orders(self): - """检查限价单是否超时""" + """检查限价单是否超时,使用锁避免重复执行""" + # 尝试获取锁,如果获取不到则说明上一个任务还在执行,直接返回 + if not self._lock.acquire(blocking=False): + logger.info("check_pending_orders: 上一个任务仍在执行,跳过本次执行。") + return + try: # 获取所有未完成订单 position_managers = self.trader.get_all_position_managers() @@ -255,7 +263,10 @@ class RealTraderManager: except Exception as e: # 顶层异常处理,捕获获取position managers或遍历时的异常 logger.error(f"检查限价单是否超时时发生异常: {str(e)}", exc_info=True) - + finally: + # 确保在任何情况下都释放锁 + if self._lock.locked(): + self._lock.release() def _check_order_feasibility(self, code, direction, amount, price): """检查订单是否可行(资金或持仓是否足够)