メニュー

2013年1月30日

Go言語で非同期関数を作るパターン

// 同期
func FuncSync() (string, error) {
    return "ok", nil
}

// 非同期
func FuncAsync() (<-chan string, <-chan error) {
    // バッファ1のチャネルにすることが重要
    // 呼び出し元がチャネル受信しない場合でもブロックしないように
    ret_ch := make(chan string, 1)
    err_ch := make(chan error, 1)
    go func() {
        ret, err := FuncSync()
        ret_ch<- ret
        err_ch<- err
    }()
    return ret_ch, err_ch
}

func main() {
    // 非同期関数を呼び出してチャネルを受け取る
    ret_ch, err_ch := FuncAsync()
   
    // この間に他の処理を行う
   
    // 非同期関数の結果を待ち合わせるためチャネル受信
    ret := <-ret_ch
    err := <-err_ch
   
    fmt.Printf("ret: %v\n", ret)
    fmt.Printf("err: %v\n", err)
}