leaf icon indicating copy to clipboard operation
leaf copied to clipboard

module 可否增加一个“启动后” 的事件通知?

Open cupen opened this issue 2 years ago • 5 comments

我有个游戏项目用了 leaf ,另加了分布式通信层和服务发现机制,需要在进程里的服务(module)全部就绪后注册到外部服务。但因为在 OnInit 阶段服务还没有全部启动完毕,所以目前我是这样做的:

go func() {
	leaf.Run(
		xxx.Module,
		yyy.Module,
		xxx.Module,
	)
}()
// 等待就绪.... 
time.Sleep(100*time.Milisecond)
// register xxx.Module into blahblah...  

这样可行,但比较看脸(实际启动时间会变的,比如又加了新功能),不太好用。 故而有点新想法,比如 module 可否有个启动后的 OnXXX 调用? 延伸一下,甚至可以细分为几个阶段:启动前、启动后、停止前、停止后。

以上个人愚见,欢迎讨论。

cupen avatar Nov 22 '21 07:11 cupen

你在全局加一个waitgroup,各模块完毕后-1,主协程这里等waigroup不就OK了…

YiuTerran avatar Jan 14 '22 00:01 YiuTerran

你在全局加一个waitgroup,各模块完毕后-1,主协程这里等waigroup不就OK了…

…… 得先有每个 module 的 启动后 这一事件,才能 wg -1。 目前的 Module 有以下几个阶段可以插入代码,哪个可以当作 “启动后”?

  1. OnInit
  2. OnDestroy
  3. Run

cupen avatar Jan 18 '22 05:01 cupen

具体点说,就是 Module 接口需要加一个 OnStarted ,用于执行“启动后” 的逻辑。 https://github.com/name5566/leaf/blob/af71eb082cdae578efb15f7e091afa8bd78410e0/module/module.go#L10-L14

这个 “启动后” ,需要在 cluster.Init() 之后执行,因为这之后才能对外宣布“本服务已就绪“。 https://github.com/name5566/leaf/blob/af71eb082cdae578efb15f7e091afa8bd78410e0/leaf.go#L24-L36

cupen avatar Feb 24 '23 08:02 cupen

再不济实现个 leaf.Start,执行完启动过程后不要阻塞,让我能在之后执行代码就行。

如果 leaf 未来要实现 cluster 模块,服务发现机制是必要的,这就需要预留出 启动后 的执行代码 。 @name5566

cupen avatar Feb 24 '23 08:02 cupen

这框架太久没维护了,你直接fork修改呗( ̄▽ ̄")

我记得原版模块是顺序启动的,理论上你可以单独加一个模块放在最后面,专门用来注册/取消注册到注册中心

YiuTerran avatar Feb 24 '23 08:02 YiuTerran