select调度问题

来源:11-4 用select进行调度

慕先生5976793

2021-03-19

package main

import (
	"fmt"
	"time"
)

type test struct {
	taskChan chan int
	quitChan chan struct{}
}

func main() {
	t := test{}
	t.taskChan = make(chan int)
	t.quitChan = make(chan struct{})

	//
	go func() {
		t.taskChan <- 1
		fmt.Println("pushed task")
	}()
	go func() {
		// close(t.quitChan)
		t.quitChan <- struct{}{}
		fmt.Println("closed quit chan")
	}()
	go t.consume()
	time.Sleep(time.Millisecond * 10)
}

func (t *test) consume() {
	for {
		select {
		case task := <-t.taskChan:
			fmt.Println("received task:", task)
			return
		case <-t.quitChan:
			fmt.Println("receive close signal")
			return
		}
	}
}

老师,我想问一下上述代码会不会存在quitChan和taskChan同时收到消息,然后select执行了quitChan,此时给taskChan的任务是不是就丢失了?

写回答

1回答

ccmouse

2021-03-20

是的。

如果不能丢失,我们考虑让发task的人来收quitChan的消息。

0
1
慕先生5976793
非常感谢!
2021-03-22
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程