[Go] gocron源码阅读-groutine与channel应用到信号捕获
直接使用go 函数名()可以开启一个grountine,channel可以接收信息并且如果没有数据时会阻塞住
channel对应的是底层数据结构的引用,复制channel和函数传参都是拷贝的引用
make的时候第二个参数是1,就表示是有缓存的channel
无缓存的channel也叫同步channel
c = make(chan interface{})
//开启groutine
go mySig()
//主grountine不能断
for {
time.Sleep(time.Second)
c <- "taoshihan"
}
func mySig() {
for {
str := <-c
fmt.Println(str)
}
}
信号处理使用channel通信
func catchSignal() {
c := make(chan os.Signal, )
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
for {
s := <-c
logger.Info("收到信号 -- ", s)
switch s {
case syscall.SIGHUP:
logger.Info("收到终端断开信号, 忽略")
case syscall.SIGINT, syscall.SIGTERM:
shutdown()
}
}
}
完整代码:
package main import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
) var c chan interface{} func main() {
go catchSignal() c = make(chan interface{})
//开启groutine
go mySig()
//主grountine不能断
for {
time.Sleep(time.Second)
c <- "taoshihan"
} }
func mySig() {
for {
str := <-c
fmt.Println(str)
}
}
func catchSignal() {
d := make(chan os.Signal, )
signal.Notify(d, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
for {
s := <-d
fmt.Println("收到信号 -- ", s)
switch s {
case syscall.SIGHUP:
fmt.Println("收到终端断开信号, 忽略")
case syscall.SIGINT, syscall.SIGTERM:
//这里可以做一些退出动作
fmt.Println("关闭")
os.Exit()
}
}
}
[Go] gocron源码阅读-groutine与channel应用到信号捕获的更多相关文章
- [Go] gocron源码阅读-go语言web框架Macaron
gocron源码中使用的是马卡龙框架,下面这个就是安装这个框架,和一般的MVC框架很像go get gopkg.in/macaron.v1git clone https://github.com/go ...
- [Go] gocron源码阅读-通过第三方cli包实现命令行参数获取和管理
gocron源码中使用的是下面这个第三方包来实现的,下面就单独的拿出来测试以下效果,和官方flag包差不多 go get github.com/urfave/cli package main impo ...
- [Go] gocron源码阅读-空接口类型interface{}
gocron源代码中的Action那个地方,就是个空接口类型Action interface{},可以传递任意类型进去,这里是传了个函数进去 command := cli.Command{ Name: ...
- [Go] gocron源码阅读-go语言中数组和切片的字面值初始化语法
源码中有这么一句,这个函数要求返回的是[]cli.Command,cli.Command类型的切片,这个地方直接使用字面值初始化了一个切片返回去了 return []cli.Command{comma ...
- [Go] gocron源码阅读-go语言中的切片接口和类型综合
// getCommands func getCommands() []cli.Command { command := cli.Command{ Name: "web", Usa ...
- [日常] gocron源码阅读-使用go mod管理依赖源码启动gocron
从 Go1.11 开始,golang 官方支持了新的依赖管理工具go modgo mod download: 下载依赖的 module 到本地 cachego mod edit: 编辑 go.modg ...
- [Go] gocron源码阅读-go语言中的切片和类型综合
在gocron.go文件的main函数中,有下面这一句,从这句代码中可以学习到切片和类型的综合运用 cliApp.Flags = append(cliApp.Flags, []cli.Flag{}.. ...
- [Go] gocron源码阅读-go语言的结构体
结构体类型 type 名字 struct{},下面这段是github.com/urfave/cli包里的代码,声明了一个App的结构体类型 type App struct { // The name ...
- [Go] gocron源码阅读-判断是否使用root用户执行
判断是linux系统,并且uid为0,allowRoot是通过命令行传参传进来的,通过flag包解析出来的,可以使用go run node.go -h看到这些参数 && !allowR ...
随机推荐
- angluarjs实现过滤并替换关键字
html样式 <body ng-app="myapp" ng-controller="myCtrl"> <input type="t ...
- none 和 host 网络的适用场景
我们会首先学习 Docker 提供的几种原生网络,以及如何创建自定义网络.然后探讨容器之间如何通信,以及容器与外界如何交互. Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 h ...
- cookies和sessions组件
目录 cookie与session cookie介绍 session介绍 token django操作cookie 设置cookie 获取cookie 删除cookie 基于cookie实现的登录认证 ...
- tensorflow dataloader 相关内容
Tensorflow dataloader 相关调研:数据读取是训练的开始,是非常关键的一步:下面是调研时搜集到的一些相关链接: 十图详解tensorflow数据读取机制 https://zhuanl ...
- 电池的QPNP模式
名词解释: CV:Constant Voltage恒压 SMMB charger:Switch-ModeBattery Charger and Boost peripheral开关模式电池充电器和升压 ...
- 微信小程序——wx.navigateTo点击后没反应
首先,检查你跳转的目标路径是不是属于tabBar,若属于,且当前页面存在tabBar时,wx.navigateTo方法是失效的. 此时可用wx.switchTab方法,并记得在app.json中的&q ...
- qtdomdocument找不到
- Docker安装MySQL 8.0并挂载数据及配置文件
安装部署环境 Ubuntu 18.04.3 LTS Docker 19.03.2 MySQL latest(8.0.17) 下载镜像 # docker从仓库中拉取最新版的mysql镜像,如果没加标签的 ...
- SpringBoot实现登陆
1.依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- Mybatis框架模糊查询+多条件查询
一.ISmbmsUserDao层 //根据姓名模糊查询 public List<Smbms> getUser(); //多条件查询 public List<Smbms> get ...