捕获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线程为啥在被打断之后没有退出,还是在运行状态,这 ...
随机推荐
- 填坑 bzoj3337
算是个板子题吧,就是不知道啥时候能写出来. #include<cstring> #include<iostream> #include<cctype> #inclu ...
- WGS 全基因组测序数据分析
1. DNA测序技术 https://www.jianshu.com/p/6122cecec54a 2.FASTA和FASTQ文件格式 https://www.jianshu.com/p/50ff30 ...
- 推荐IOS Moneky测试工具Fast Monkey
推荐IOS Moneky测试工具Fast Monkey 1 介绍 非插桩 iOS Monkey, 支持控件,每秒4-5 action事件 2 下载 https://github.com/zhangzh ...
- salt修改主机名
#!/bin/bash if [ $# != 2 ];then echo "bash $0 old_hostname new_hostname" exit 0 fi old_hos ...
- 常用war包插件
<build> <resources> <resource> <directory>src/main/java</directory> &l ...
- Win10,Anaconda,tensorflow-gpu安装教程
,参考于:https://www.cnblogs.com/guoyaohua/p/9265268.html 目录 前言 第一步:安装Anaconda 1.下载和安装 2.配置Anaconda环境变量 ...
- python 散点图上给每个点打标签方便看到数据
import numpy as np import matplotlib.pyplot as plt x=[2.3,4.5,3,7,6.5,4,5.3] y=[5,4,7,5,5.3,5.5,6.2] ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- Docker学习-从无知到有知的学习过程
Docker学习 最近被别人提到的docker吸引到了注意力,所以打算先快速的了解一下docker到底是个上面东西. 之所以我写下这个文档呢,是为了记录对docker一无所知我是如何进行学习一门新技术 ...
- Android studio中遇到的问题
首先声明只是Android studio使用中遇到的问题纯属个人学习笔记,有什么不对的可以留言. 将脱壳后的java文件拖入到Android studio android studio 首先提示是ER ...