一个信号量与定时器的例子(Golang)

程序可用来定时执行一些任务,并通过信号量处理,在被强制中断时,也能做相应警告及清理处理.

package main

//信号量与定时器
//author: Xiong Chuan Liang
//date: 2015-2-25

import "fmt"
import "os"
import "os/signal"
import "time"

func main() {

	sigs := make(chan os.Signal, 1)
	done := make(chan bool, 1)

	signal.Notify(sigs, os.Interrupt, os.Kill)

	go func() {
		sig := <-sigs
		switch sig {
		case os.Interrupt:
			fmt.Println("signal: Interrupt")
		case os.Kill:
			fmt.Println("signal: Kill")
		default:
			fmt.Println("signal: Others")
		}
		done <- true
	}()

	fmt.Println("awaiting signal")

	//main()....
	go JobTicker(done)
	<-done
	close(done)
	//app.Exit()
	fmt.Println("exiting")
}

func JobTicker(done <-chan bool) {
	ticker := time.NewTicker(time.Second)
	defer ticker.Stop()

	for {
		select {
		case <-done:
			return
		case <-ticker.C:
			fmt.Println("job......")
		}
	}
}

如果按 ctrl-C 则结果如下:

awaiting signal
job......
job......
signal: Interrupt
interrupt
exiting

Go by Example: Signals:    https://gobyexample.com/signals

MAIL: [email protected]

Blog: http://blog.csdn.net/xcl168

时间: 2024-08-11 01:34:06

一个信号量与定时器的例子(Golang)的相关文章

[转]一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程

一个简单的Linux多线程例子 带你洞悉互斥量 信号量 条件变量编程 希望此文能给初学多线程编程的朋友带来帮助,也希望牛人多多指出错误. 另外感谢以下链接的作者给予,给我的学习带来了很大帮助 http://blog.csdn.net/locape/article/details/6040383 http://www.cnblogs.com/liuweijian/archive/2009/12/30/1635888.html 一.什么是多线程? 当我自己提出这个问题的时候,我还是很老实的拿着操作系

热更新配置参数例子(Golang)

在不停止程序的情况下,通过发送USR1或USR2等信号量,触发运行中程序的参数更新处理.当然还可以通过处理如kill等信号量, 让程序正确的处理退出操作. 做了个例子,效果如下. 可以看到通过发出kill -USR1 id号 让对应的程序参数发生了变更. 关于kill的参数值可以通过kill -l列出. 各个终端也提供了很多快捷键来支持特定信息的发送,如最常见的ctrl+c. 但注意,各个终端的快捷键定义可能不一样,而且有些是可以自定义的,这个要注意,在使用前可以用stty -a查出. 附上测试

一个php多态性的小例子

多态性在 OO 中指 "语言具有以不同方式处理不同类型对象的能力",但 PHP 是弱类型语言,在这一点上就比较弱,仅有 instance of 可以用于判断对象的类型 多态性的优点:让代码更接近生活中的真实情况 一下是一个非常简单的多态性例子,描述在电脑上安装不同操作系统,linux, OS X, windows 和 computer 是两种不同类型的对象. interface os{ function name(); function creator(); } class linux

一个简单的回调(例子)

1.声明一个回调Interface: public interface CallBack { /** * 执行回调方法 * @param objects 将处理后的结果作为参数返回给回调方法 */ public void execute(Object... objects ); } 2.回调的地方继承回调,实现回调的方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe

ThinkPHP 学习(2)---一个简单的起步的例子

文件夹目录是核心目录ThinkPHP,入口文件是index.php,ThinkPHP里面的文件含义下次详解,接下来是启动一个自己的程序,现在可以修改一下入口文件,一般情况下会将自己的文件放在一个文件夹,我现在是先建立自己的文件夹,一个前台Home文件夹,一个后台文件夹Admin,怎么建立一个结构拥有ThinkPHP功能的文件夹呢?打开index.php,加入如下代码, <?php    //1.确定应用名称Home    define('APP_NAME','Admin');    //2.确定

一个android的webview的例子

截图如图所示. 核心部分代码 package com.example.app; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; imp

每天进步一点点-实例为导学-一个java对象序列化的例子

序列化和反序列化例子 如果我们想要序列化一个对象, (对象 转 序列)首先要创建某些OutputStream(如FileOutputStream.ByteArrayOutputStream等),然后将这些OutputStream封装在一个ObjectOutputStream中.这时候,只需要调用writeObject()方法就可以将对象序列化,并将其发送给OutputStream(记住:对象的序列化是基于字节(1字节8位)的,不能使用Reader和Writer等基于字符的层次结构).而反序列的过

一个基本的傅立叶变换例子

clear;clc; tempresult=[]; figure for i=1:6 filename=['ROISignals_sub_00' num2str(i) '_2000.mat']; data=importdata(filename); x=data(:,1); fs=2; % L=length(x); L=256; y1=fft(x,L); y2=fftshift(y1); mag=abs(y2); f=(0:L-1)*fs/L-fs/2; tempresult=[tempresu

一个简单的iBatis入门例子

一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import java.util.Date; public class Person { private int id; private String firstName; private String lastName; private double weightInKilograms; private do