本節學習
waitgroup的用法
waitgroup 用於實現工作池,因此要理解工作池,我們首先需要學習 waitgroup。
waitgroup 用於等待一批 go 協程執行結束。程式控制會一直阻塞,直到這些協程全部執行完畢。假設我們有 3 個併發執行的 go 協程(由 go 主協程生成)。go 主協程需要等待這 3 個協程執行結束後,才會終止。這就可以用 waitgroup 來實現
package main
import (
"fmt"
"time"
"sync"
)func login(wg *sync.waitgroup)
func getuserinfo(wg *sync.waitgroup)
func main()
上面寫了兩次wg.add(1),當然你也可以寫一次wg.add(2)
下面是waitgroup 的使用說明
1.waitgroup 是乙個等待協程完成的結構體
2.主協程通過呼叫add 方法設定等待協程的數量
3.每個子協程完成的時候,需要呼叫done 方法,那麼等待的協程數量會自動減一
4.wait方法主要告訴協程,開啟等待模式,知道所有的協程完成工作
注意事項
go login(&wg)
我們一定要傳遞指標型別的變數,因為sync.waitgroup 是結構體,是值型別,在傳遞的過程中會賦值,如果不用指標,建立的時候,就不是原來的結構體了
工作池工作池就是一組等待任務分配的協程。一旦完成了所分配的任務,這些執行緒可繼續等待任務的分配。
我們會使用緩衝通道來實現工作池。我們工作池的任務是計算所輸入數字的每一位的和。例如,如果輸入 234,結果會是 9(即 2 + 3 + 4)。向工作池輸入的是一列偽隨機數。
我們工作池的核心功能如下:
建立乙個 go 協程池,監聽乙個等待作業分配的輸入型緩衝通道。
將作業新增到該輸入型緩衝通道中。
作業完成後,再將結果寫入乙個輸出型緩衝通道。
從輸出型緩衝通道讀取並列印結果。
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)type job struct
type result struct
var jobs = make(chan job, 10)
var results = make(chan result, 10)
// 1.建立工作任務
func allocate(noofjobs int)
jobs
}// 關閉工作通道
close(jobs)
}// 2.計算數的和
func digits(number int) int
time.sleep(2 * time.second)
return sum
}// 執行一項工作 一項工作啟用 乙個協程 工作完畢後,等待組減一 多個協程同時呼叫 這個方法 會對 同乙個通道 jobs 產生競爭,誰先拿到值,誰先執行
func 3.worker(wg *sync.waitgroup)
results
}wg.done()
}// 4.建立執行數量的工作組
func createworkerpool(noofworkers int)
wg.wait()
// 當所有任務執行完畢後,關閉通道
close(results)
}// 5.對結果進行輸出
func result(done chan bool)
done
}func main()
案例二
download.go
package util
import (
"sync"
"fmt"
)var results = make(chan string)
var tasks = make(chan string)
type download struct
func (d *download)createtasks(urls string)
close(tasks)
}func (d *download)downloadby(url string)
func (d *download)startdownload(ws * sync.waitgroup)
ws.done()
}func (d *download)createworkerpool(num int, finish chan bool)
var urls = string{}
for i:=0;i < 100;i++
download.download(urls, func(result string) )
}
image.png 什麼是好工作
當初微軟有個唐駿,很多大學裡的年輕人覺得這才是他們嚮往的職業生涯,我在清華bbs裡發的帖子被這些學子們所不屑,那個時候學生們只想出國或者去外企,不過如今看來,我還是對的,唐駿去了盛大,創立的盛大,一家民營公司。乙個高學歷的海歸在500強的公司裡拿高薪水,這大約是很多年輕人的夢想,問 題是,每年畢業的...
什麼才是好工作
我有個有趣的觀察,外企公司多的是25 35歲的白領,40歲以上的員工很少,二三十歲的外企員工是意氣風發的,但外企公司40歲附近的經理人是很尷尬的。我見過的40歲附近的外企經理人大多在一直跳槽,最後大多跳到民企,比方說,唐駿。外企員工的成功很大程度上是公司的成功,並非個人的成功,西門子的確比國美大,但...
再見,大學!你好,工作!
昨天,2007年7月16日,我成為了乙個真正的 員工 過去的兩年,我經歷過成立passion 一起做專案 一起籌畫創業,和和uranus一起實習等等很多難忘的事情。一眨眼,大學畢業了,大家各奔東西,很多人四年時間建立起的默契煙消雲散。在這點上,我是幸運的,現在還是有一幫很好的朋友的身邊,可以分享每天...