最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang?WorkerPool線程池并發(fā)模式示例詳解

 更新時(shí)間:2022年08月17日 09:12:32   作者:龔國(guó)瑋  
這篇文章主要為大家介紹了Golang?WorkerPool線程池并發(fā)模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

 正文

Worker Pools 線程池是一種并發(fā)模式。該模式中維護(hù)了固定數(shù)量的多個(gè)工作器,這些工作器等待著管理者分配可并發(fā)執(zhí)行的任務(wù)。該模式避免了短時(shí)間任務(wù)創(chuàng)建和銷(xiāo)毀線程的代價(jià)。

golang 中,我們使用 goroutinechannel 來(lái)構(gòu)建這種模式。工作器 worker 由一個(gè) goroutine 定義,該 goroutine 通過(guò) channel 獲取數(shù)據(jù)。

處理CVS文件記錄

接下來(lái)讓我們通過(guò)一個(gè)例子,來(lái)進(jìn)一步理解該模式。假設(shè)您需要處理來(lái)自 CVS 文件的記錄數(shù)據(jù),我們需要將該文件中的經(jīng)緯度保存到數(shù)據(jù)庫(kù)中。代碼如下。

package main
import (
	"encoding/csv"
	"fmt"
	"os"
	"time"
)
type city struct {
	name     string
	location string
}
func createCity(record city) {
	time.Sleep(10 * time.Millisecond)
}
func main() {
	startTime := time.Now()
	csvFile, err := os.Open("cities.csv")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Successfully Opened CSV file")
	defer csvFile.Close()
	csvLines, err := csv.NewReader(csvFile).ReadAll()
	if err != nil {
		fmt.Println(err)
	}
	counter := 0
	for _, line := range csvLines {
		counter++
		createCity(city{
			name:     line[0],
			location: line[1],
		})
	}
	fmt.Println("records saved:", counter)
	fmt.Println("total time:", time.Since(startTime))
}

?? 獲取測(cè)試數(shù)據(jù)

cities.csv

輸出:

正如我們所看到的,保存 CSV 中所有記錄需要 55 秒,這是很長(zhǎng)的時(shí)間,可能會(huì)導(dǎo)致很多性能問(wèn)題。用戶如果想要上傳 CSV 文件,那體驗(yàn)感一定很差。

如何解決這個(gè)問(wèn)題?那我們就使用線程池的方法試試看。

線程池耗時(shí)差異

在如下示例中,我們將解決相同的需求,但通過(guò)線程池,耗時(shí)方面,我們能夠看到巨大的差異。來(lái)吧!

代碼如下

package main
import (
	"encoding/csv"
	"fmt"
	"os"
	"time"
)
type city struct {
	name     string
	location string
}
func createCity(record city) {
	time.Sleep(10 * time.Millisecond)
}
func readData(cityChn chan []city) {
	var cities []city
	csvFile, err := os.Open("cities.csv")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("Successfully Opened CSV file")
	defer csvFile.Close()
	csvLines, err := csv.NewReader(csvFile).ReadAll()
	if err != nil {
		fmt.Println(err)
	}
	for _, line := range csvLines {
		cities = append(cities, city{
			name:     line[0],
			location: line[1],
		})
	}
	cityChn <- cities
}
func worker(cityChn chan city) {
	for val := range cityChn {
		createCity(val)
	}
}
func main() {
	startTime := time.Now()
	cities := make(chan []city)
	go readData(cities)
	const workers = 5
	jobs := make(chan city, 1000)
	for w := 1; w <= workers; w++ {
		go worker(jobs)
	}
	counter := 0
	for _, val := range <-cities {
		counter++
		jobs <- val
	}
	fmt.Println("records saved:", counter)
	fmt.Println("total time:", time.Since(startTime))
}

輸出:

你看到很大的不同了嗎?現(xiàn)在同樣的過(guò)程只需要 8 秒。正如您所見(jiàn),當(dāng)我們需要處理大量數(shù)據(jù)時(shí),線程池非常有用。

使用線程池,我們必須定義一個(gè)函數(shù),在示例中該函數(shù)為 worker,該函數(shù)用于定義工作進(jìn)程,您可以看到它接收一個(gè) Channel 通道來(lái)處理數(shù)據(jù)。 另外,我們必須在數(shù)據(jù)傳遞到通道之前啟動(dòng) goroutines 協(xié)程,當(dāng) Channel 通道獲取到值時(shí),goroutines 工作者開(kāi)始處理它們。

?? 現(xiàn)在您知道如何實(shí)現(xiàn)線程池了!

以上就是Golang WorkerPool線程池并發(fā)模式示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Golang WorkerPool線程池并發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go-kit組件使用hystrix中間件的操作

    go-kit組件使用hystrix中間件的操作

    這篇文章主要介紹了go-kit組件使用hystrix中間件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go文件操作(新建打開(kāi)寫(xiě)入讀取刪除關(guān)閉)學(xué)習(xí)筆記

    Go文件操作(新建打開(kāi)寫(xiě)入讀取刪除關(guān)閉)學(xué)習(xí)筆記

    這篇文章主要為大家介紹了Go文件操作(新建打開(kāi)寫(xiě)入讀取刪除關(guān)閉)學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 詳解Go語(yǔ)言如何使用xorm實(shí)現(xiàn)讀取mysql

    詳解Go語(yǔ)言如何使用xorm實(shí)現(xiàn)讀取mysql

    xorm是go語(yǔ)言的常用orm之一,可以用來(lái)操作數(shù)據(jù)庫(kù)。本文就來(lái)和大家聊聊Go語(yǔ)言如何使用xorm實(shí)現(xiàn)讀取mysql功能,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-11-11
  • Go語(yǔ)言Gin處理響應(yīng)方式詳解

    Go語(yǔ)言Gin處理響應(yīng)方式詳解

    gin框架封裝了常用的數(shù)據(jù)格式方法響應(yīng)于客戶端,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言Gin處理響應(yīng)方式的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • golang調(diào)試bug及性能監(jiān)控方式實(shí)踐總結(jié)

    golang調(diào)試bug及性能監(jiān)控方式實(shí)踐總結(jié)

    這篇文章主要為大家介紹了golang調(diào)試bug及性能監(jiān)控方式實(shí)踐是總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go語(yǔ)言中 Channel 詳解

    Go語(yǔ)言中 Channel 詳解

    Go 語(yǔ)言中的 channel 是實(shí)現(xiàn) goroutine 間無(wú)鎖通信的關(guān)鍵機(jī)制,他使得寫(xiě)多線程并發(fā)程序變得簡(jiǎn)單、靈活、觸手可得。下面就個(gè)人理解對(duì) channel 使用過(guò)程中應(yīng)該注意的地方進(jìn)行一個(gè)簡(jiǎn)要的總結(jié)。
    2018-10-10
  • 淺析Go中序列化與反序列化的基本使用

    淺析Go中序列化與反序列化的基本使用

    序列化是指將對(duì)象轉(zhuǎn)換成字節(jié)流,從而存儲(chǔ)對(duì)象或?qū)?duì)象傳輸?shù)絻?nèi)存、數(shù)據(jù)庫(kù)或文件的過(guò)程,反向過(guò)程稱(chēng)為“反序列化”。本文主要介紹了Go中序列化與反序列化的基本使用,需要的可以參考一下
    2023-04-04
  • go無(wú)緩沖通道的實(shí)現(xiàn)及應(yīng)用

    go無(wú)緩沖通道的實(shí)現(xiàn)及應(yīng)用

    在Go語(yǔ)言中,無(wú)緩沖通道是一種特殊的通道類(lèi)型,本文主要介紹了go無(wú)緩沖通道的實(shí)現(xiàn)及應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    這篇文章主要介紹了Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實(shí)現(xiàn)callerSkip詳解

    go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實(shí)現(xiàn)callerSkip詳解

    這篇文章主要為大家介紹了go?logger不侵入業(yè)務(wù)代碼使用slog替換zap并實(shí)現(xiàn)callerSkip詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論

高雄市| 文登市| 偃师市| 太保市| 丁青县| 绍兴县| 会昌县| 高州市| 措勤县| 巢湖市| 渑池县| 宁国市| 育儿| 浦北县| 甘孜县| 定结县| 安化县| 白水县| 石首市| 耿马| 嘉善县| 贵阳市| 蓝田县| 富顺县| 开化县| 海林市| 十堰市| 博湖县| 安庆市| 利辛县| 武义县| 六安市| 江阴市| 大名县| 二连浩特市| 嘉峪关市| 肥东县| 东乌珠穆沁旗| 白河县| 西乡县| 鲜城|