goroutine并发执行多个任务并依次返回结果

直接上code。

package main

import (
    "fmt"
    "time"
)

func func1(ch chan string) {
    time.Sleep(time.Second * 2)
    ch <- "func1 ok"
}

func func2(ch chan string) {
    time.Sleep(time.Second * 10)
    ch <- "func2 ok"
}

func Run(f func(ch chan string), cOut chan string) {
    chRun := make(chan string)
    go f(chRun)

    select {
    case r := <-chRun:
        cOut <- r
    case <-time.After(time.Second * 3):  // 超时控制
        cOut <- "time out"
    }
}

func SyncCron(functions ...func(ch chan string)) []string {
    // 创建n个chan用来接受任务结果
    chs := make([]chan string, len(functions))

    // 关闭 chan
    defer func() {
        for _, c := range chs {
            if c != nil {
                close(c)
            }
        }
    }()

    // 执行 func
    for i, f := range functions {
        chs[i] = make(chan string)
        go Run(f, chs[i])
    }

    // 取结果
    result := make([]string, len(functions))
    for i, ch := range chs {
        result[i] = <-ch
    }

    // 返回结果
    return result
}

func main() {
    r := SyncCron(func1, func2)
    fmt.Println(r[0])
    fmt.Println(r[1])
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!