捕获Ctrl + C中断 优雅的退出程序 golang
捕获Ctrl + C中断 优雅的退出程序
- os/signal 来捕获系统中断等信号
// Notify方法将signal发送到channel,
func Notify(c chan<- os.Signal, sig ...os.Signal)
// 初始化一个接受os.Signal的通道
c := make(chan os.Signal)
// 调用Notify方法,绑定signal到channel,一旦有信号到达,signal会发送到channel中
signal.Notify(c, os.Interrupt)
- 代码实现在命令行每隔200ms打印字符"#",使用time.Ticker实现每隔2s打印完整一次
- task有一个close的channel,用来接受停止信号
- 实例化一个os.Signal来接受诸如ctrl+c的停止信号
- 使用sync.WaitGroup来组织多个goroutine的调度
package main
import (
"fmt"
"os"
"os/signal"
"sync"
"time"
)
type Task struct {
closed chan struct{}
wg sync.WaitGroup
ticker *time.Ticker
}
func (t *Task) Run() {
for {
select {
case <-t.closed:
return
case <-t.ticker.C:
handle()
}
}
}
func (t *Task) Stop() {
close(t.closed)
}
func handle() {
for i := 0; i < 5; i++ {
fmt.Print("#")
time.Sleep(time.Millisecond * 200)
}
fmt.Println()
}
func main() {
task := &Task{
closed: make(chan struct{}),
ticker: time.NewTicker(time.Second * 2),
}
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt)
task.wg.Add(1)
go func() { defer task.wg.Done(); task.Run() }()
select {
case sig := <-c:
fmt.Printf("Got %s signal. Aborting...\n", sig)
task.Stop()
}
task.wg.Wait()
}
捕获Ctrl + C中断 优雅的退出程序 golang的更多相关文章
- Java 优雅地退出程序
本文转载自Java 优雅地退出程序 导语 很多情况下,我们的程序需要在操作系统 后台 一直运行,这在程序代码里的实现就是用死循环 ( while (true) ) 来实现的.但是,这样会出现一个问题, ...
- stm32f103_高级定时器——输入捕获/输出比较中断+pwm=spwm生成
****************************首选我们了解一下它们的功能吧********************************************************** ...
- 优雅退出在Golang中的实现
背景 为什么需要优雅关停 在Linux下运行我们的go程序,通常有这样2种方式: 前台启动.打开终端,在终端中直接启动某个进程,此时终端被阻塞,按CTRL+C退出程序,可以输入其他命令,关闭终端后程序 ...
- 如何优雅的关闭Golang Channel?
Channel关闭原则 不要在消费端关闭channel,不要在有多个并行的生产者时对channel执行关闭操作. 也就是说应该只在[唯一的或者最后唯一剩下]的生产者协程中关闭channel,来通知消费 ...
- 如何优雅的关闭golang的channel
How to Gracefully Close Channels,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多. 众所周知,在golang中,关闭或者向已关闭的channel发送 ...
- python捕获Ctrl+C信号
我们希望当服务器接收到一个 SIGTERM 信号时能够自动关机,或者做一些善后的操作,以下是实现的方法 import signal # 自定义信号处理函数 def my_handler(signum, ...
- Linux Shell中捕获CTRL+C
#!/bin/bash trap 'onCtrlC' INTfunction onCtrlC () { echo 'Ctrl+C is captured'} while true; do echo ' ...
- go捕获Ctrl+C信号
我们希望当服务器接收到一个 SIGTERM 信号时能够自动关机,或者做一些善后的操作,以下是实现的方法 package main import ( "os" "os/si ...
- java线程基础巩固---Thread中断Interrupt方法学习&采用优雅的方式结束线程生命周期
Interrupt学习: 在jdk中关于interrupt相关方法有三个,如下: 关于上面的疑问会在稍后进行阐述滴,下面看代码: 编译运行: 应该说是t线程为啥在被打断之后没有退出,还是在运行状态,这 ...
随机推荐
- 删除github中某个文件夹
在上传项目到github时,忘记忽略了某个文件夹target,就直接push上去了, 最后意识到了此问题,决定删除掉远程仓库中的target文件夹 删除前: 删除后: 在github上只能删除仓库,却 ...
- springmvc,controller层在接收浏览器url传来的参数带中文乱码问题。
请求地址:http://localhost:8080/saveFlashSale?fsRemark=哈哈哈哈哈 接收方法:@RequestMapping("/saveFlashSale&qu ...
- Redis的三个框架:Jedis,Redisson,Lettuce
Jedis api 在线网址:http://tool.oschina.net/uploads/apidocs/redis/clients/jedis/Jedis.html redisson 官网地址: ...
- 第4课 decltype类型推导
第4课 decltype类型推导 一.decltype类型推导 (一)语法: 1.语法:decltype(expr),其中的expr为变量(实体)或表达式 2.说明: ①decltype用于获取变量的 ...
- TreeMap源码分析2
package map; import org.junit.Test; import com.mysql.cj.api.x.Collection; import map.TreeMap1.Ascend ...
- idea 跳转提示多个实现类
- docker镜像上传阿里云仓库
推送至阿里云镜像:1.首先在阿里云上选择容器镜像服务,创建命名空间以及镜像仓库2. docker login --username=zhangshitongsky@163.com registry.c ...
- HTML 引用大全
路径logo <link rel="icon" href="../framework7-4.4.10/kitchen-sink/core/img/ztjs.png& ...
- .net HttpClient 回传实体帮助类
public class HttpClientHelper<T> { /// <summary> /// Get请求 返回实体 /// </summary> /// ...
- Smobiler客户端会话
//客户端会话存值 Client.Session["userid"] = Class1.userid; //客户端会话取值 userid = Client.Session[&quo ...