goroutinesで複数のHTTP呼び出しを行う負荷テストツールを作成していますが、今は指定された期間だけ実行できるようにしようとしています。一定時間後にゴルーチンをキャンセルする方法
スリープが完了したら、どのようにしてゴルーチンをキャンセルできますか?
私が現在行っているのは、特定の期間、time.Sleep()
を行うゴルーチンを作成することです。終了すると、チャネルにメッセージがブロードキャストされます。
私の無限ループでは、私はswitch文でメッセージを待ち受けています。これは私が望むのと同じように機能します。
問題は、go httpPost()
行のゴルーチンがHTTP呼び出しを続けることです。私はその機能にチャンネルを渡して、同じCALL_TIME_RAN_OUT
メッセージも聞こうとしますが、何らかの理由で私がしたときには、メッセージがブロードキャストされるのを待つのではなく、 Sleep
の最後。
誰かが私が取ることができるよりよいアプローチを知っていますか?これは動作していないようです。
func attack(cfg AttackConfig) {
// some code ...
var ar attackResponse
ch := make(chan uint8, 8)
go func() {
time.Sleep(cfg.Duration * time.Second)
ch <- CALL_TIME_RAN_OUT
}()
for {
if atomic.LoadInt32(&currConnections) < atomic.LoadInt32(&maxConnections) - 1 {
go httpPost(cfg, &ar, ch)
}
switch <-ch {
// some other cases ...
case CALL_TIME_RAN_OUT:
fmt.Printf("%d seconds have elapsed. Shutting down!", cfg.Duration)
return
}
}
}
func httpPost(cfg AttackConfig, a *attackResponse, ch chan uint8) {
// some code here to create HTTP client ...
for {
// some code to make HTTP call ...
switch <-ch {
case CALL_TIME_RAN_OUT:
return
}
}
}
チェック[コンテキスト](https://golang.org/pkg/context/)。その目的の1つは、キャンセルプリミティブを提供することです。 – zerkms
ああ、ありがとう、私はそれを見ていきます。 – Lansana
forループに 'for startTime.Sub(time.Now())を追加できますか?Seconds()> 60 {}'? – Acidic