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

栏目: IT技术 · 发布时间: 6年前

内容简介:在软件开发过程中,我们常常做的一件事,就是编写公用库,或是基础库。这个过程可以称之为以信号管控为例,在 Go 语言中管控进程信号,非常简单。只需要简单的 3 行代码即可完成管控:但在实际开发过程中,这些功能性的函数缺少了

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

以信号管控为例,在 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 .

基础库

网络库


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C和C++代码精粹

C和C++代码精粹

阿林森 / 董慧颖 / 人民邮电出版社 / 2003-4-1 / 59.00

《C和C++代码精粹》基于作者备受好评的C/C++ User Journal杂志上的每月专栏,通过大量完全符合ISO标准C++的程序集合,说明了C++真正强大的威力,是C和C++职业程序员的实践指南。可以帮助有一定经验的C和C++程序员深入学习这两种密切相关的语言,对书中代码的参悟和应用,可以帮助他们从根本上提高使用程序的效率。一起来看看 《C和C++代码精粹》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具