直接上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 協議》,轉載必須註明作者和本文連結