但是该策略存在一个问题,就是当任务通道中的信号没有被处理完时,收到退出信号后,通道中的数据同样不会被执行,直接退出。

package main

import (
	"fmt"
	"os"
	"os/signal"
	"sync"
	"syscall"
	"time"
)


var wg sync.WaitGroup
var in=make(chan int,10)
var quit=make(chan int,1)
var quito0k=make(chan int,1)

func ListenQuit(){
	defer wg.Done()
	var sign=make(chan os.Signal,1)
	signal.Notify(sign,syscall.SIGINT)
	<-sign
	SQuit()

}

func run(){
	defer wg.Done()
Quit:
	for {
		select {
		case out := <-in:
			fmt.Println(out)
		case <-quit:
			time.Sleep(time.Second*1)
			break Quit
		}
	}

if len(in)>0 {//处理完通道中数据
	for i:=0;i<len(in);i++{
		<-in
		fmt.Println("11111")
	}
}

}

func producerin(){
Quit:
	for {
		select {
		case in<-0:
		case <-quit://停止写数据
			break Quit
		}
	}

}


func SQuit(){
	close(quit)
	go func(){
		wg.Wait()
		quito0k<-0
	}()
}
func main(){
	go ListenQuit()
	go func(){
		for i := 0; i <10; i++ {
			wg.Add(1)
			go run()
		}
	}()
	wg.Add(1)
	go producerin()
	<-quito0k
	fmt.Println("qiut ok")

}

第一步:
停止往通道中写数据

func producerin(){
Quit:
	for {
		select {
		case in<-0:
		case <-quit://停止写数据
			break Quit
		}
	}

}

第二步:
协程跳出for循环

for {
		select {
		case out := <-in:
			fmt.Println(out)
		case <-quit:
			time.Sleep(time.Second*1)
			break Quit
		}
	}

第三步:
处理通道中数据

if len(in)>0 {//处理完通道中数据
	for i:=0;i<len(in);i++{
		<-in
		fmt.Println("11111")
	}
}

第四步:退出
执行结果:
在这里插入图片描述