Go 編程: 應用級抽象之信號管控

在軟件開發過程當中,咱們經常作的一件事,就是編寫公用庫,或是基礎庫。這個過程能夠稱之爲 應用級抽象。應用級抽象的好處在於,接口主要面向應用,因此在適配度遠遠超過功能性接口。

以信號管控爲例,在 Go 語言中管控進程信號,很是簡單。只須要簡單的 3 行代碼便可完成管控:git

package main

import "os/signal"

func main() {
    //信號接收 channel
    sigCh := make(chan os.Signal, 1)
    
    //監聽信號(全部信號)
    signal.Notify(sigCh)

    //信號觸發
    sig := <-sigch
    //TODO
}

但在實際開發過程當中,這些功能性的函數缺乏了應用級抽象,想要像搭積木同樣構建應用程序多少有些不便。因此,花了點時間作一下應用級別抽象,方便之後使用。github

既然是應用級抽象,就從應用層面入手,首先給這塊抽象的積木,按照功能命個名,就叫Capture好了。網絡

//信號捕獲器
type Capture struct{
  //TODO
}

既然是信號捕獲, 在建立Capture時須要定義具體信號的觸發操做,將具體<信號,觸發函數>,取個英文名Trap。那麼,在建立Capture時,就能夠作爲參數傳進去。同時,Capture必須處於服務狀態,才能夠監聽並觸發信號操做,因此須要提供一個Capture.Serve函數。最終但願的應用級接口就是這樣:框架

package main

import (
    "context"
    "log"
    "syscall"

    "github.com/x-mod/sigtrap"
)

func main() {
  ctx, cancel := context.WithCancel(context.Background())
  
    capture := sigtrap.New(
        sigtrap.Trap(syscall.SIGINT, sigtrap.Handler(cancel)),
        sigtrap.Trap(syscall.SIGTERM, sigtrap.Handler(cancel)),
    )
    defer capture.Close()
    log.Println("sigtrap: waiting ...")
    log.Println("sigtrap:", capture.Serve(ctx))
}

具體的Capture實現也很是的簡單,能夠直接參考項目源碼: github.com/x-mod/sigtrap.不少相似這樣簡單工具包均沒有太多的技術難度,封裝主要目的就是在作應用級抽象tcp

這個包主要用在個人另一個應用級抽象包:x-mod/routine中。它主要抽象的是,main函數與go routine協程控制,具體實現功能之後抽時間分享,感興趣的話能夠參考項目源碼。函數

更多應用級抽象工具包目錄在這個倉庫:github.com/x-mod/index.工具

基礎庫

網絡庫

相關文章
相關標籤/搜索