goroutine 无法执行

先来看一段代码

package main

import (
	"fmt"
	"time"
)

var sem = make(chan int, 1)

type Request struct {
	Name string
}

func Serve(queue chan *Request) {
	for req := range queue {
		sem <- 1
		go func() {
			fmt.Println("groutine receive: ", req)
			<-sem
		}()
		// runtime.Gosched()  // 这里打不打开注释有什么作用呢?
	}
}

func main() {
	queue := make(chan *Request, 4)
	queue <- &Request{"1"}
	queue <- &Request{"2"}
	queue <- &Request{"3"}
	queue <- &Request{"4"}

	close(queue)
	Serve(queue)

	time.Sleep(1 * time.Second)
}

直接运行这段代码的输出为

groutine receive:  &{2}
groutine receive:  &{3}
groutine receive:  &{4}
groutine receive:  &{4}

而如果将 runtime.Gosched()注释打开的话输出结果为

groutine receive:  &{1}
groutine receive:  &{2}
groutine receive:  &{3}
groutine receive:  &{4}

为什么会有结果不同呢,这是因为 goroutine 需要cpu时间片去执行。而 runtime.Gosched() 可以让出cpu时间片。
这里不得不说 Goroutine 在执行的时候是有陷阱的,如何保证我们的 goroutine 都会执行呢?

在工作代码比较多的时候,我们遇到上述错误的机会很少。因为我们的程序基本都会执行runtime中提供的一些功能,例如channel,系统调用, fmt.Sprint, Mutex, time.Sleep等,这些使用会使调试器让出时间片,从而让其它有 goroutine 有机会执行。

参考
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值