Trampoline函数通过循环执行thunk避免栈溢出,不直接实现多任务协作;真正的协作调度需将任务封装为返回thunk或结果的函数,由Trampoline统一逐个推进,实现用户态协作式调度。

Trampoline函数本身不直接实现多任务协作,它是一种控制流优化技术,用于将递归调用转化为循环执行,避免栈溢出。真正用于多任务协作的是基于Trampoline的协程调度模式——把每个任务写成返回“下一步动作”的函数,由Trampoline统一调度、逐个推进。
理解Trampoline的核心机制
Trampoline函数接收一个返回“thunk”(零参数函数)或最终结果的函数,反复调用该函数直到返回非函数值。这个过程把嵌套调用“压平”为迭代,让控制权始终回到调度器手中,从而为任务切换提供机会。
- 每次任务执行只做一小步,然后返回下一个要执行的函数(或done信号)
- Trampoline不主动暂停任务,而是依赖任务自觉交还控制权
- 没有线程或事件循环参与,纯用户态协作式调度
构造可协作的任务函数
每个任务需封装为返回thunk或result的函数。常见结构是:处理一部分逻辑 → 返回下个步骤(可能是自身、其他任务,或终止信号)。
- 用对象标记状态,例如
{ type: 'continue', fn: nextStep }或{ type: 'done', value: result } - 避免在任务内部使用
while或长循环,应拆成多次返回thunk - 可配合闭包保存局部状态,如计数器、缓冲区等
实现简易协作调度器
Trampoline调度器本质是一个while循环,不断执行当前任务直到它返回非函数值,并支持任务间显式切换。
- 任务可通过返回
{ task: otherTask, args: [...] }请求切换到另一任务 - 调度器识别这类指令后,将
otherTask(...args)作为下一步执行目标 - 可加入优先级队列或轮转逻辑,实现公平调度(如每次执行固定步数后让出)
与真实协程的区别和适用场景
这种模式是手动协程(manual coroutine),不是语言原生的async/await或generator。它轻量、无依赖,但需要开发者主动拆分逻辑。
- 适合CPU密集型但可分步的计算任务,比如树遍历、规则引擎推理、状态机推进
- 不适合I/O等待——它不挂起,只是反复检查;真异步仍需Promise或事件驱动配合
- 调试友好:每一步都清晰可见,堆栈始终扁平,便于日志和断点

















