教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Go 编程: 应用级抽象之信号管控

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

发布时间:2021-04-28   编辑:jiaochengji.com
教程集为您提供Go 编程: 应用级抽象之信号管控等资源,欢迎您收藏本站,我们将为您提供最新的Go 编程: 应用级抽象之信号管控资源
在软件开发过程中,我们常常做的一件事,就是编写公用库,或是基础库。这个过程可以称之为应用级抽象。应用级抽象的好处在于,接口主要面向应用,所以在适配度远远超过功能性接口。

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

基础库

  • x-mod/build - 项目版本信息控制包 - Blog
  • x-mod/cmd - 更快速的命令行辅助包 - Blog
  • x-mod/errors - 多功能错误辅助包 - Blog
  • x-mod/event - 事件触发辅助包
  • x-mod/sigtrap - 系统信号辅助包 - Blog
  • x-mod/routine - 协程控制、主函数辅助包
  • x-mod/tlsconfig - 证书设置辅助包 - Blog

网络库

  • x-mod/tcpserver - tcpserver 快速构建框架 - Blog
  • x-mod/thriftudp - thriftudp 快速构建框架 - Blog
  • x-mod/httpclient - httpclient 请求、响应辅助包
  • x-mod/httpserver - httpserver 程序友好构建包

到此这篇关于“Go 编程: 应用级抽象之信号管控”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Go 编程: 应用级抽象之信号管控
rust golang_Rust vs. Go:如何选择
今日头条 Go 建千亿级微服务的实践
简单理解 Goroutine 是如何工作的
想学一门新的编程语言?考虑一下Go (Golang)吧
golang知识点
Go语言的主要特性和发展影响
go语言和python哪个难
工作好多年有可能还未真正了解接口和抽象类
Go语言学习3----Go语言特色

[关闭]
~ ~