Goで同時実行数を制限しながらループを並列処理する。

Web+DB Press Vol95 のGoの記事を読んで理解するために自分でも書いてみた。

WEB+DB PRESS Vol.95

WEB+DB PRESS Vol.95

自分の環境は go1.7.3 darwin/amd64

同時実行数制限付きでループを並列処理する。

秒単位でスリープ処理を入れてしまっているので、実行時間は長いです。そこはお勉強用ということで。

出力結果

time:2016-12-02 14:40:49.5804542 +0900 JST      index:-1        item:-1
sleepなし。順番不定。
time:2016-12-02 14:40:49.580639488 +0900 JST    index:2 item:3
time:2016-12-02 14:40:49.580686796 +0900 JST    index:3 item:4
time:2016-12-02 14:40:49.580652343 +0900 JST    index:0 item:1
time:2016-12-02 14:40:49.580703936 +0900 JST    index:4 item:5
time:2016-12-02 14:40:49.580712672 +0900 JST    index:5 item:6
time:2016-12-02 14:40:49.580725039 +0900 JST    index:6 item:7
time:2016-12-02 14:40:49.580731445 +0900 JST    index:1 item:2
sleepあり。順番に出力。
time:2016-12-02 14:40:50.582086998 +0900 JST    index:0 item:1
time:2016-12-02 14:40:51.581872261 +0900 JST    index:1 item:2
time:2016-12-02 14:40:52.581816362 +0900 JST    index:2 item:3
time:2016-12-02 14:40:54.583265777 +0900 JST    index:3 item:4
time:2016-12-02 14:40:56.583142187 +0900 JST    index:4 item:5
time:2016-12-02 14:40:58.582018719 +0900 JST    index:5 item:6
time:2016-12-02 14:41:01.584457553 +0900 JST    index:6 item:7
sleepあり。Sleepの短い順番に出力。
time:2016-12-02 14:41:03.585628436 +0900 JST    index:1 item:2
time:2016-12-02 14:41:04.58563381 +0900 JST     index:0 item:3
time:2016-12-02 14:41:05.585852568 +0900 JST    index:3 item:2
time:2016-12-02 14:41:06.585637432 +0900 JST    index:2 item:5
time:2016-12-02 14:41:06.585995853 +0900 JST    index:5 item:1
time:2016-12-02 14:41:12.586825274 +0900 JST    index:4 item:8

セマフォ取得用のオブジェクトで、同時実行数の制限。deferで開放しないと詰まる。

WaitGroupでプログラムの待ちを設定。ないと、スリープ処理をしてる間にプログラムが終了してしまう。deferでセマフォを開放するタイミングで一緒にWaitGroupも減らす。