Leaf Go

善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:

  • 能够恢复 goroutine 运行过程中的错误
  • 游戏服务器会等待所有 goroutine 执行结束后才关闭
  • 非常方便的获取 goroutine 执行的结果数据
  • 在一些特殊场合保证 goroutine 按创建顺序执行我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):
  1. log.Debug("1")
  2.  
  3. // 定义变量 res 接收结果
  4. var res string
  5.  
  6. skeleton.Go(func() {
  7. // 这里使用 Sleep 来模拟一个很慢的操作
  8. time.Sleep(1 * time.Second)
  9.  
  10. // 假定得到结果
  11. res = "3"
  12. }, func() {
  13. log.Debug(res)
  14. })
  15.  
  16. log.Debug("2")

上面代码执行结果如下:

  1. 2015/08/27 20:37:17 [debug ] 1
  2. 2015/08/27 20:37:17 [debug ] 2
  3. 2015/08/27 20:37:18 [debug ] 3

这里的 Go 方法接收 2 个函数作为参数,第一个函数会被放置在一个新创建的 goroutine 中执行,在其执行完成之后,第二个函数会在当前 goroutine 中被执行。由此,我们可以看到变量 res 同一时刻总是只被一个 goroutine 访问,这就避免了同步机制的使用。Go 的设计使得 CPU 得到充分利用,避免操作阻塞当前 goroutine,同时又无需为共享资源同步而忧心。

更加详细的用法可以参考 leaf/go