package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
start := time.Now()
results := Google("golang")
fmt.Println(results)
fmt.Printf("%s", time.Since(start))
}
type Result string
type Search func(key string) Result
func ResourceSearch(kind string) Search {
return func(key string) Result {
time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)
return Result(fmt.Sprintf("<%s from %s server>\n", key, kind))
}
}
func FirstSearch(servers []Search, key string) Result {
result := make(chan Result)
done := make(chan struct{})
defer close(done)
first := func(i int) {
select {
case <-done:
return
case result <- servers[i](key):
}
}
for i := range servers {
go first(i)
}
return <-result
}
func Google(key string) (results []Result) {
var images []Search
var videos []Search
var voices []Search
for i := 0; i < 3; i++ {
images = append(images, ResourceSearch(fmt.Sprintf("image-%d", i)))
videos = append(videos, ResourceSearch(fmt.Sprintf("video-%d", i)))
voices = append(voices, ResourceSearch(fmt.Sprintf("voice-%d", i)))
}
chanResults := make(chan Result)
go func() {
chanResults <- FirstSearch(images, key)
}()
go func() {
chanResults <- FirstSearch(videos, key)
}()
go func() {
chanResults <- FirstSearch(voices, key)
}()
after := time.After(80 * time.Millisecond)
for i := 0; i < 3; i++ {
select {
case r := <-chanResults:
results = append(results, r)
case <-after:
fmt.Println("timeout")
return
}
}
return
}
实例说明golang并发
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 这是本系列文章的第二篇,第一篇在此golang并发三板斧系列之一:channel用于通信和同步。 前文描述了手工作...
- goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,...
- 官方链接 接口介绍 type Limiter Limter限制时间的发生频率,采用令牌池的算法实现。这个池子一开始...