分享
  1. 首页
  2. 文章

Go 编程: 应用级抽象之信号管控

JayL · · 4148 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在软件开发过程中,我们常常做的一件事,就是编写公用库,或是基础库。这个过程可以称之为应用级抽象。应用级抽象的好处在于,接口主要面向应用,所以在适配度远远超过功能性接口。

以信号管控为例,在 Go 语言中管控进程信号,非常简单。只需要简单的 3 行代码即可完成管控:

package main
import "os/signal"
func main() {
 //信号接收 channel
 sigCh := make(chan os.Signal, 1)
 
 //监听信号(所有信号)
 signal.Notify(sigCh)
 //信号触发
 sig := <-sigch
 //TODO
}

但在实际开发过程中,这些功能性的函数缺少了应用级抽象,想要像搭积木一样构建应用程序多少有些不便。所以,花了点时间做一下应用级别抽象,方便以后使用。

既然是应用级抽象,就从应用层面入手,首先给这块抽象的积木,按照功能命个名,就叫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.很多类似这样简单工具包均没有太多的技术难度,封装主要目的就是在做应用级抽象

这个包主要用在我的另外一个应用级抽象包:x-mod/routine中。它主要抽象的是,main函数与go routine协程控制,具体实现功能以后抽时间分享,感兴趣的话可以参考项目源码。

更多应用级抽象工具包目录在这个仓库:github.com/x-mod/index.

基础库

网络库


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:JayL

查看原文:Go 编程: 应用级抽象之信号管控

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
4148 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏