golang 管道控制流程

有些事件处理有如此特性:1、阻塞等待事件执行完毕 2、阻塞等待事件超时则直接关闭

golang的channel具有很好处理这些事件的方法

package main

import (
	"fmt"
	"time"
)

func main() {
	test_chan3()
}

func test_chan3() {

	done := make(chan int)
	go func() {
	//do_something()
		close(done) //所有阻塞这个读这个管道的协程都不在阻塞这个操作上
	}()

	go func() {
		//done <- 1 写入会panic
		<-done //读取不会再阻塞
		fmt.Printf("done here \n")
	}()
	// Wait for remaining connections to finish or
	// force them all to close after timeout
	select {
	case <-time.After(5 * time.Second):
	case <-done:
	}

	time.Sleep(5 * time.Second)

	fmt.Printf("stop a while and done the thing \n")

}

输出结果:

done here 

stop a while and done the thing



你可能感兴趣的:(golang 管道控制流程)