Leaf Go
善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:
- 能够恢复 goroutine 运行过程中的错误
- 游戏服务器会等待所有 goroutine 执行结束后才关闭
- 非常方便的获取 goroutine 执行的结果数据
- 在一些特殊场合保证 goroutine 按创建顺序执行我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):
- log.Debug("1")
- // 定义变量 res 接收结果
- var res string
- skeleton.Go(func() {
- // 这里使用 Sleep 来模拟一个很慢的操作
- time.Sleep(1 * time.Second)
- // 假定得到结果
- res = "3"
- }, func() {
- log.Debug(res)
- })
- log.Debug("2")
上面代码执行结果如下:
- 2015/08/27 20:37:17 [debug ] 1
- 2015/08/27 20:37:17 [debug ] 2
- 2015/08/27 20:37:18 [debug ] 3
这里的 Go 方法接收 2 个函数作为参数,第一个函数会被放置在一个新创建的 goroutine 中执行,在其执行完成之后,第二个函数会在当前 goroutine 中被执行。由此,我们可以看到变量 res 同一时刻总是只被一个 goroutine 访问,这就避免了同步机制的使用。Go 的设计使得 CPU 得到充分利用,避免操作阻塞当前 goroutine,同时又无需为共享资源同步而忧心。
更加详细的用法可以参考 leaf/go。