当代码运行时,有时会打印attack()函数所花费的时间 我知道当攻击写入通道并且主要读取它然后主要退出并且不等待计时器(“攻击”)执行时,它们是竞争条件
我是新来的:_)
package main
import (
"fmt"
"time"
)
func timer(funcName string) func(){
startTime := time.Now()
return func(){
fmt.Printf("%s took %v time to run \n", funcName, time.Since(startTime))
}
}
func main(){
defer timer("main")()
smokeSignal := make(chan bool)
evilNinga := "Tommy"
go attack(evilNinga, smokeSignal)
fmt.Println(<-smokeSignal)
}
func attack(target string, smokeSignal chan<-bool){
defer timer("attack")()
time.Sleep(time.Second)
fmt.Println("Throwing ninja stars at ", target)
smokeSignal <- true
}
有人可以告诉如何处理这种情况吗,我想打印两个函数所花费的时间,并使用通道
有人可以告诉如何处理这种情况吗
当
main
退出时,程序将终止,并发 goroutine 不会正常终止,因此不能保证现有的 defer 会运行。这就是这里发生的情况:当您发送烟雾信号时,如果 attack
goroutine 被取消调度,那么 main 可以在重新调度之前返回,因此 defer
永远不会运行。
有很多选项可以处理这个问题,但所有这些选项都会导致基本相同的结果:确保在函数运行后在通道上发送,您可以通过例如(非详尽)来做到这一点