Skip to content

刻 ​

刻(tick)是NACEB协调三个FSMController的统一推进机制,负责队列调度与层间状态同步。

各层在一刻中的具体动作见Task、Pipeline与Event。

刻发生 ​

刻可以由以下来源激活:

来源时机
基础时钟每50ms调用一次
start()Event离开idle后
resume()Event离开paused后
Task收尾execute()进入done、failure或stopped后
Task停止或重启Task进入stopped或重新进入pending后
快进刻上一刻报告发生推进后

alertTick()执行期间会自锁。此时到达的其他激活请求会被丢弃,不会排队累积。

基础时钟 ​

ensureClock()确保全局只存在一个50ms定时器。

定时器每次触发时先通过EventFSMController.hasLive()判断是否仍需运行:

Event状态保持时钟原因
idle、paused否等待外部start()或resume()
blocked、queue、activating、processing、pending是仍需调度或同步
done、failure,未启用bypassConsume是等待外部消费
done、failure,启用bypassConsume否Event层会自动消费

没有需要保持时钟的Event时,定时器会停止。之后创建Event、调用start()或resume()会再次执行ensureClock()。

WARNING

未消费的普通终局Event会持续保持基础时钟运行。

若不需要取得结果,应使用自动消费机制。

快进刻 ​

三个Controller中任意一个报告本刻发生推进时,NACEB会通过setTimeout(..., 0)立即激活下一刻。

因此50ms只是基础时钟的兜底间隔,不是状态转移的最小间隔。

TIP

队列持续可推进时,NACEB会通过快进刻连续运行。

Controller报告的moved表示本刻完成了一次推进尝试,不严格等同于状态值发生改变。

被VetoT否决的可重试转移也会触发快进刻,使下一刻重新计算条件。

刻发生时 ​

alertTick()激活一刻,并按固定顺序等待三个Controller:

text
TaskFSMController.nextTick()
  → PipelineFSMController.nextTick()
    → EventFSMController.nextTick()

顺序从下层到上层,使下层已经产生的结果可以在同一刻继续向上传递。

注意 ​

Hook会被nextTick()等待,因此耗时Hook会阻塞当前刻。

纯观测应使用EventBus。

Released under the MIT License.