import asyncio
import threading

# 1. 最底层的异步函数（模拟开发者想在同步节点里调用的第三方异步库）
async def inner_async_task():
    print(f"  -> [Inner Async Task] 当前线程: {threading.current_thread().name}")
    await asyncio.sleep(0.5) # 模拟异步 I/O
    return "异步请求的数据"

# 2. 开发者写的“手欠”同步节点（Sync Node）
def bad_sync_node():
    print(f"-> [Sync Node] 当前线程: {threading.current_thread().name}")
    print("-> [Sync Node] 准备调用 asyncio.run()...")
    
    # 危险操作：在同步函数里调用 asyncio.run()
    # 只有当前线程没有正在运行的 event loop 时，这行代码才能成功！
    result = asyncio.run(inner_async_task()) 
    
    print(f"-> [Sync Node] 成功获取结果: {result}")
    return "Sync Node 执行成功"

# 3. 框架的执行引擎（模拟你的 async_sequential_exec）
async def framework_engine():
    print(f"[Framework Engine] 主事件循环启动，当前线程: {threading.current_thread().name}")
    print("[Framework Engine] 准备通过 asyncio.to_thread 执行同步节点...\n")
    
    # 核心防线：使用 to_thread 将节点抛入线程池
    result = await asyncio.to_thread(bad_sync_node)
    
    print(f"\n[Framework Engine] 执行结束，拿到最终返回值: {result}")

if __name__ == "__main__":
    # 启动框架的主 event loop
    asyncio.run(framework_engine())
