Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Go - goroutineによる並列処理

はじめに

Goのgoroutineの習作です。

習作

goとchanを使うと簡単に並列処理ができるけど、もう少し練習が必要な気がします。
コードでは仕事量に合わせてgoroutineを走らせています。

/**
 * Reference:
 * http://techblog.raccoon.ne.jp/archives/38566907.html
 * http://mattn.kaoriya.net/software/lang/go/20160706165757.htm
 */
package main

import (
    "time"
    "sync"
    "fmt"
    "log"
)

/**
 * 文字列を短くしていくワーカー
 *
 */
func worker(wg *sync.WaitGroup, msgch chan string, id int) {
    defer func() {
        // 終わったらこのワーカーをグループからデクリメント
        wg.Done()
    }()

    // このワーカーの名前
    name := fmt.Sprintf("worker %d", id)

    // チャンネルから処理する仕事を受け取るまで待機
    msg := <- msgch

    // 仕事を開始
    for len(msg) > 0 {
        time.Sleep(time.Second/60)
        log.Printf("%s: %s", name, msg)
        msg = msg[:len(msg)-1]
    }
}

func main() {
    // 並行処理させたい仕事
    msgs := [] string {
        "this is a pen.",
        "this is a apple.",
        "ah.",
        "applepen.",
    }
    // 並行処理のグループ
    var wg sync.WaitGroup
    // 並行処理のチャンネル
    msgch := make(chan string)

    for i, msg := range msgs {
        // インクリメントしてグループにワーカーを登録
        wg.Add(1)
        // 並行処理を開始
        go worker(&wg, msgch, i)
        // チャンネルに処理させたい仕事を送る
        msgch <- msg
    }

    // チャンネルを閉じないと例のアレが出る
    close(msgch)

    // グループに登録したgoroutineが終了するのを待つ
    wg.Wait()
}

参考

narupo
個人Web開発者。C, Python3, JavaScript, Django などが好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away