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限制時間的發生頻率,采用令牌池的算法實現。這個池子一開始...