ということでこんなかんじで実装しましたよ、というお話。
ちなみにコードのほとんどは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 件のコメント:
コメントを投稿