2017-03-26 8 views
3

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 
     } 
    } 
} 
+2

チェック[コンテキスト](https://golang.org/pkg/context/)。その目的の1つは、キャンセルプリミティブを提供することです。 – zerkms

+0

ああ、ありがとう、私はそれを見ていきます。 – Lansana

+0

forループに 'for startTime.Sub(time.Now())を追加できますか?Seconds()> 60 {}'? – Acidic

答えて

2

使用パッケージgolang.org/x/net/context

は、ここでは、コード(除去無関係部)です。 Go 1.7はとして標準ライブラリにgolang.org/x/net/contextパッケージを移動します。 バージョン1.7以上を使用している場合はimport contextとなります。

使用方法は簡単です。

package main 

import (
    "context" 
    "fmt" 
    "time" 
) 

func test(ctx context.Context) { 
    t := time.Now() 

    select { 
    case <-time.After(1 * time.Second): 
     fmt.Println("overslept") 
    case <-ctx.Done(): 
    } 
    fmt.Println("used:", time.Since(t)) 
} 

func main() { 
    ctx, _ := context.WithTimeout(context.Background(), 50*time.Millisecond) 
    test(ctx) 
} 
関連する問題