ということでこんなかんじで実装しましたよ、というお話。
ちなみにコードのほとんどはmattn氏のBig Sky :: Golang の channel の使い所 : の引用です。
// RPSから間隔を計算 func calcInt(x int) int64 { return int64(1 / float64(x) *1000 *1000) } func main() { // Channel宣言 task := make(chan int) // TaskQue用 taskquit := make(chan bool) // SetTask停止用 workerquit := make(chan bool) // JobWorker停止用 // WaitGroup作成 wg := &sync.WaitGroup{} // Job Worker go func() { loop: for { select { case <-taskquit: workerquit <- true break loop case job := <-task: wg.Add(1) なんかの処理(job) wg.Done() } } }() // SetTask Worker go func() { // RPS間隔計算 interval := calcInt(rps) sleepWait := time.Duration(interval) * time.Microsecond for i := 0; i < key; i++ { task <- i time.Sleep(sleepWait) // Log Print if i%rps == 0 { fmt.Printf("%d loop - TaskSet Done.\n",i) } } taskquit <- true }() // WaitGroup終了まで待つ wg.Wait() <-workerquit }
0 件のコメント:
コメントを投稿