goの中にはselect-caseとtimeが入っています.Tickerの使用上の注意事項

1032 ワード

先週末にGo技術パーティーに参加し、京東の美人エンジニアがselect-caseとtimeについて話した.Tickerの使用上の注意点(実際の応用シーンは:パケットの受け取り順をテストするときにtickを付けてパケットをなくしたことに気づいた)が興味深いので、記録しておきます.
package main

import (
	"fmt"
	"runtime"
	"time"
)

func init() {
	runtime.GOMAXPROCS(runtime.NumCPU())
}

func main() {
	ch := make(chan int, 1024)
	go func(ch chan int) {
		for {
			val := 

出力は次のとおりです.
val:0
val:1
val:2
val:3
val:4
val:5
6: case 

問題はこのselectにあります.
select { case ch case fmt.Printf("%d: case }
両方のcase条件が満たされると、実行時にシステムは擬似ランダムアルゴリズムによってどのcaseが実行されるかを決定します.
だからtick.C条件が満たされたそのサイクルは、ある確率でchをもたらす
解決策1:tick.Cランダムなcaseがランダムに到着すると、ch select{
case ch case
fmt.Printf("%d: case
ch }
解決策2:tick.Cのcaseは単独で1つのselectの中に置いて、そして1つのdefaultを加えます(ブロックしないことを保証します)
select {
case ch }
select {
case
fmt.Printf("%d: case default:
}
両方のソリューションの出力は、次のようになります.
val:0
val:1
val:2
val:3
val:4
5: case