用好工作池 WaitGroup

2021-09-12 09:48:34 字數 2630 閱讀 2874

本節學習

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一起實習等等很多難忘的事情。一眨眼,大學畢業了,大家各奔東西,很多人四年時間建立起的默契煙消雲散。在這點上,我是幸運的,現在還是有一幫很好的朋友的身邊,可以分享每天...