Leaf游戲服務(wù)器簡(jiǎn)析(一)之模塊生命周期

Module(模塊)的生命周期

使用leaf開發(fā)游戲服務(wù)器由多個(gè)模塊組成,模塊的定義如下:

// leaf/module.go
type Module interface{
    OnInit()
    OnDestroy()
    Run(closeSig chan bool)
}

模塊需要實(shí)現(xiàn)OnInit(),OnDestroy(),Run(closeSig chan bool)三個(gè)接口,這三個(gè)接口定義了模塊生命周期的行為.

以官方項(xiàng)目LeafServer為例說(shuō)明模塊的運(yùn)行機(jī)制

// server/main.go (片段)
// LeafServer程序的入口
func main() {
    // ......
    leaf.Run(
        game.Module,
        gate.Module,
        login.Module,
    )
}

程序入口調(diào)用leaf.Run(),在Run函數(shù)里面分別注冊(cè)了game.Module, gate.Module, login.Module,在leaf源碼里我們可以看到leaf.Run()的行為:

// leaf/leaf.go
func Run(mods ...module.Module) {
    // ...
    // module
    for i := 0; i < len(mods); i++ {
        module.Register(mods[i])
    }
    module.Init()

    // ...

    // 通過(guò)channel c來(lái)監(jiān)聽來(lái)自操作系統(tǒng)的終止指令
    c := make(chan os.Signal, 1)
    signal.Notify(c, os.Interrupt, os.Kill)
    // 等待終止指令, 一旦讀到終止指令則執(zhí)行之后的代碼,module.Destroy()將調(diào)用各個(gè)模塊的OnDestroy()
    sig := <-c

    // ...
    module.Destroy()
}

函數(shù)參數(shù)mods是我們傳進(jìn)來(lái)的各個(gè)模塊,module.Register(mod)將我們的模塊注冊(cè)到module中去:

// leaf/module.go
var mods []*module
func Register(mi Module) {
    m := new(module)
    m.mi = mi
    m.closeSig = make(chan bool, 1)
    mods = append(mods, m)
}

之后調(diào)用module.Init()對(duì)我們注冊(cè)的模塊進(jìn)行初始化,進(jìn)入OnInit()周期,之后對(duì)每個(gè)模塊開啟goroutine來(lái)進(jìn)入各模塊的Run()周期:

// leaf/module.go

// 初始化
func Init() {
    for i := 0; i < len(mods); i++ {
        mods[i].mi.OnInit()
    }

    for i := 0; i < len(mods); i++ {
        m := mods[i]
        m.wg.Add(1)
        // 開啟goroutine
        go run(m)
    }
}

func run(m *module) {
    m.mi.Run(m.closeSig)
    m.wg.Done()
}

而Module生命周期的結(jié)束階段則在系統(tǒng)讀取到終止命令時(shí)執(zhí)行module.Destroy()來(lái)進(jìn)行模塊的銷毀邏輯:

// leaf/module.go

func Destroy() {
    for i := len(mods) - 1; i >= 0; i-- {
        m := mods[i]
        m.closeSig <- true
        m.wg.Wait()
        destroy(m)
    }
}

func destroy(m *module) {
    defer func() {
        if r := recover(); r != nil {
            if conf.LenStackBuf > 0 {
                buf := make([]byte, conf.LenStackBuf)
                l := runtime.Stack(buf, false)
                log.Error("%v: %s", r, buf[:l])
            } else {
                log.Error("%v", r)
            }
        }
    }()
    m.mi.OnDestroy()
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市情萤,隨后出現(xiàn)的幾起案子术奖,更是在濱河造成了極大的恐慌蹦锋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衣吠,死亡現(xiàn)場(chǎng)離奇詭異倍谜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)弄息,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勤婚,“玉大人摹量,你說(shuō)我怎么就攤上這事÷ǎ” “怎么了缨称?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)祝迂。 經(jīng)常有香客問(wèn)我睦尽,道長(zhǎng),這世上最難降的妖魔是什么型雳? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任当凡,我火速辦了婚禮山害,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沿量。我一直安慰自己浪慌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布朴则。 她就那樣靜靜地躺著权纤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乌妒。 梳的紋絲不亂的頭發(fā)上汹想,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音撤蚊,去河邊找鬼欧宜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛拴魄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播席镀,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼匹中,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了豪诲?” 一聲冷哼從身側(cè)響起顶捷,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屎篱,沒想到半個(gè)月后服赎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡交播,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年重虑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦士。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缺厉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出隧土,到底是詐尸還是另有隱情提针,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布曹傀,位于F島的核電站辐脖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏皆愉。R本人自食惡果不足惜嗜价,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一艇抠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炭剪,春花似錦练链、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至错妖,卻和暖如春绿鸣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暂氯。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工潮模, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痴施。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓擎厢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辣吃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子动遭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容