fix(runtime): enforce main event loop ownership (#6424)

This commit is contained in:
InfinityPacer
2026-08-23 20:14:31 +08:00
committed by GitHub
parent c72b4fe88e
commit 1d2984b95f
14 changed files with 181 additions and 55 deletions
+14 -23
View File
@@ -1,4 +1,3 @@
import asyncio
import copy
import json
import os
@@ -1359,18 +1358,8 @@ class GlobalVar(object):
EMERGENCY_STOP_WORKFLOWS: List[int] = []
# 需应急停止文件整理
EMERGENCY_STOP_TRANSFER: List[str] = []
# 当前事件循环
CURRENT_EVENT_LOOP: AbstractEventLoop = None
@classmethod
def _get_event_loop(cls) -> AbstractEventLoop:
"""返回当前线程事件循环,缺失时创建并绑定新循环。"""
try:
return asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop
# 生命周期登记的主事件循环
CURRENT_EVENT_LOOP: Optional[AbstractEventLoop] = None
def stop_system(self):
"""
@@ -1461,19 +1450,21 @@ class GlobalVar(object):
@property
def loop(self) -> AbstractEventLoop:
"""
当前循环
"""
if self.CURRENT_EVENT_LOOP is None:
self.CURRENT_EVENT_LOOP = self._get_event_loop()
return self.CURRENT_EVENT_LOOP
"""返回由应用生命周期登记的主事件循环。"""
loop = self.CURRENT_EVENT_LOOP
if loop is None or not loop.is_running() or loop.is_closed():
raise RuntimeError("主事件循环尚未启动或已经停止")
return loop
def set_loop(self, loop: AbstractEventLoop):
"""
设置循环
"""
def set_loop(self, loop: AbstractEventLoop) -> None:
"""登记承载主程序异步任务的事件循环。"""
self.CURRENT_EVENT_LOOP = loop
def clear_loop(self, loop: AbstractEventLoop) -> None:
"""仅在登记值仍为目标循环时清除主事件循环。"""
if self.CURRENT_EVENT_LOOP is loop:
self.CURRENT_EVENT_LOOP = None
# 全局标识
global_vars = GlobalVar()