package main

import (
	"fmt"
	"sync"
	"time"
)

func workRoutine(work chan string, done chan string, wg *sync.WaitGroup) {
	select {
	case donemsg := <-done:
		fmt.Println(donemsg)
	case msg := <-work:
		//这里将有大量工作可能半个小时都未必执行完,这样 done 这个 channel 就无法收到退出信号
		for i := 0; i < 100000; i++ {
			fmt.Println(msg)
			time.Sleep(time.Second)
		}
	case <-time.After(time.Second * 1000):
		fmt.Println("timeout")
	}
	wg.Done()
}
func closeWorkRoutine(done chan string, wg *sync.WaitGroup) {
	//目标是 10 秒后希望能关掉 test 这个协程
	time.Sleep(time.Second * 10)
	done <- "done"
	wg.Done()
}
func main() {
	done := make(chan string)
	work := make(chan string, 1)
	wg := sync.WaitGroup{}
	wg.Add(2)
	work <- "work"
	go workRoutine(work, done, &wg)
	go closeWorkRoutine(done, &wg)
	wg.Wait()
}

请参考上面的代码,我现在有两个协程,一个叫 workRoutine ,另一个叫 closeWorkRoutine ,我的目标是希望 closeWorkRoutine 可以在 10 秒后可以关闭 workRoutine 的协程,但是上面这个代码是无法关闭的,因为 work 过于繁重,永远轮不到执行关闭的时候。请问有什么办法可以直接关闭协程,而无需介意当前协程的状态,最好能像线程那样有一个 ID 我可以直接在外部强制关掉,请问我应该如何做呢,谢谢。