亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

 正文

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

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

處理CVS文件記錄

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

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))
}

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

cities.csv

輸出:

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

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

線程池耗時差異

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

代碼如下

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)在同樣的過程只需要 8 秒。正如您所見,當(dāng)我們需要處理大量數(shù)據(jù)時,線程池非常有用。

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

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

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

相關(guān)文章

  • Golang sync.Map原理深入分析講解

    Golang sync.Map原理深入分析講解

    go中map數(shù)據(jù)結(jié)構(gòu)不是線程安全的,即多個goroutine同時操作一個map,則會報錯,因此go1.9之后誕生了sync.Map,sync.Map思路來自java的ConcurrentHashMap
    2022-12-12
  • Golang限流庫與漏桶和令牌桶的使用介紹

    Golang限流庫與漏桶和令牌桶的使用介紹

    這篇文章主要介紹了golang限流庫以及漏桶與令牌桶的實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • Go cobra庫使用教程

    Go cobra庫使用教程

    cobra既是一個用于創(chuàng)建強(qiáng)大現(xiàn)代CLI應(yīng)用程序的庫,也是一個生成應(yīng)用程序和命令文件的程序。cobra被用在很多go語言的項(xiàng)目中,比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等
    2022-12-12
  • windows下安裝make及使用makefile文件

    windows下安裝make及使用makefile文件

    這篇文章主要為大家介紹了windows下安裝make及使用makefile文件方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解Go語言如何實(shí)現(xiàn)字符串切片反轉(zhuǎn)函數(shù)

    詳解Go語言如何實(shí)現(xiàn)字符串切片反轉(zhuǎn)函數(shù)

    Go?語言不像其他語言如?Python,有著內(nèi)置的?reverse()?函數(shù),本文將先學(xué)習(xí)一下Python中對于列表的反轉(zhuǎn)方法,然后再學(xué)習(xí)如果在Go語言中實(shí)現(xiàn)相同的功能,感興趣的小伙伴快跟隨小編一起來學(xué)習(xí)一下
    2022-10-10
  • 深入了解Go的interface{}底層原理實(shí)現(xiàn)

    深入了解Go的interface{}底層原理實(shí)現(xiàn)

    本文主要介紹了Go的interface{}底層原理實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Golang環(huán)境變量設(shè)置和查看工具go env詳解

    Golang環(huán)境變量設(shè)置和查看工具go env詳解

    go env 是 Go 工具鏈中的一個命令,用于設(shè)置和查看當(dāng)前 Golang 環(huán)境的相關(guān)信息,對于理解、編譯和運(yùn)行 Golang 程序非常有用,本文就給大家簡單的介紹一下Golang環(huán)境變量設(shè)置和查看工具go env,需要的朋友可以參考下
    2023-07-07
  • Golang標(biāo)準(zhǔn)庫和外部庫的性能比較

    Golang標(biāo)準(zhǔn)庫和外部庫的性能比較

    這篇文章主要介紹Golang標(biāo)準(zhǔn)庫和外部庫的性能比較,下面文章講圍繞這兩點(diǎn)展開內(nèi)容,感興趣的小伙伴可以參考一下
    2021-10-10
  • go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)詳解

    go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了go?doudou開發(fā)gRPC服務(wù)快速上手實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 淺析Go中關(guān)于零值和空值判斷的問題

    淺析Go中關(guān)于零值和空值判斷的問題

    這篇文章主要是對零值和空值判斷現(xiàn)狀進(jìn)行簡單的梳理和分享,文中的示例代碼講解詳細(xì),對我們深入了解go語言有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08

最新評論