goの中にはselect-caseとtimeが入っています.Tickerの使用上の注意事項
1032 ワード
先週末にGo技術パーティーに参加し、京東の美人エンジニアがselect-caseとtimeについて話した.Tickerの使用上の注意点(実際の応用シーンは:パケットの受け取り順をテストするときにtickを付けてパケットをなくしたことに気づいた)が興味深いので、記録しておきます.
出力は次のとおりです.
問題はこの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:
}
両方のソリューションの出力は、次のようになります.
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