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

go協(xié)程池實現(xiàn)原理小結(jié)

 更新時間:2025年04月14日 09:21:51   作者:Achilles.Wang  
本文主要介紹了go協(xié)程池實現(xiàn)原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在go語言編程中有一種池肯定避免不了,那就是-協(xié)程池,無論你是日常工作還是面試中面試官都無法避免協(xié)程池,掌握協(xié)程池你也就算是入門go的并發(fā)編程了,打一波廣告后面會有專門的文章來介紹如何在go中進行并發(fā)編程。

協(xié)程本身也是一種資源,但是協(xié)程池有自己的特殊性,那是由協(xié)程池執(zhí)行任務(wù)的特殊性決定的,協(xié)程作為資源使用時其實是在消費其他資源,也就是說必須向協(xié)程池提供一個統(tǒng)一的接口,所有需要協(xié)程池執(zhí)行的任務(wù)都需要實現(xiàn)該接口,然后被協(xié)程池統(tǒng)一調(diào)用。

這里我們就要求所有需要被協(xié)程執(zhí)行的函數(shù)都要實現(xiàn)Worker接口的Task方法

type Worker interface {
	Task()
}

另外一個特殊的點,在于go協(xié)程執(zhí)行時特別是用戶添加任務(wù)時最好能夠讓用戶能夠感知到協(xié)程池當前的工作狀態(tài),因此這里采用無緩沖區(qū)的chan作為協(xié)程池任務(wù)傳遞工具,能直接根據(jù)向chan添加任務(wù)時的狀態(tài)感知到當前協(xié)程池的工作狀態(tài)。這里采用最簡單的阻塞方式來實現(xiàn),當協(xié)程池忙的情況下直接阻塞直到協(xié)程池空閑用戶才能將自己的任務(wù)添加到協(xié)程池的管道中進行執(zhí)行。

在這里插入圖片描述

go中使用協(xié)程進行工作,因此會創(chuàng)建并使用協(xié)程池進行工作非常的有必要,work 包的目的是展示如何使用無緩沖的通道來創(chuàng)建一個 goroutine 池,這些 goroutine 執(zhí)行并控制一組工作,讓其并發(fā)執(zhí)行。在這種情況下,使用無緩沖的通道要比隨意指定一個緩沖區(qū)大小的有緩沖的通道好,因為這個情況下既不需要一個工作隊列,也不需要一組 goroutine 配合執(zhí)work 包的目的是展示如何使用無緩沖的通道來創(chuàng)建一個 goroutine 池,這些 goroutine 執(zhí)行并控制一組工作,讓其并發(fā)執(zhí)行。在這種情況下,使用無緩沖的通道要比隨意指定一個緩沖區(qū)大小的有緩沖的通道好,因為這個情況下既不需要一個工作隊列,也不需要一組goroutine 配合執(zhí)

結(jié)構(gòu)體

協(xié)程池工作比較單一,就是調(diào)用指定的Task方法,另外因為給出任務(wù)時最好能立刻執(zhí)行或者不能立刻執(zhí)行需要讓用戶等待,因此協(xié)程池最好使用無緩沖的通道,這樣當用戶需要執(zhí)行Task時就能直接從接口中感知到當前協(xié)程池是否空閑了。

type Worker interface {
	Task()
}

type Pool struct {
	// 使用無緩沖通道實現(xiàn)協(xié)程池
	work chan Worker
	// 輔助計數(shù)器,用于協(xié)程池同步
	wg   sync.WaitGroup
}

創(chuàng)建協(xié)程池

創(chuàng)建協(xié)程池需要指定最大并發(fā)數(shù),當有新的任務(wù)加入時,會立即被執(zhí)行,而當沒有任務(wù)時,所有協(xié)程池中的協(xié)程阻塞競爭等待通道中的"任務(wù)"。

// New 創(chuàng)建一個工作池
func New(maxGoroutine int) *Pool {
	p := Pool{
		work: make(chan Worker),
	}
	p.wg.Add(maxGoroutine)
	for i := 0; i < maxGoroutine; i++ {
		go func() {
			// 一直循環(huán)取任務(wù),直到work被關(guān)閉為止并且通道中的任務(wù)執(zhí)行完畢為止
			for w := range p.work {
				w.Task()
			}
			// 退出時候,減少一個計數(shù)器
			p.wg.Done()
		}()
	}
	return &p
}

協(xié)程池啟動和關(guān)閉

觸發(fā)協(xié)程池工作很簡單,只需要向協(xié)程池等待的通道中放入一個任務(wù)即可,當協(xié)程池關(guān)閉時,所有任務(wù)都會被立即執(zhí)行,當所有任務(wù)執(zhí)行完畢,協(xié)程池中的所有協(xié)程都會退出。

// Run 將任務(wù)放入工作池
func (p *Pool) Run(w Worker) {
	p.work <- w
}

// Shutdown 等待所有g(shù)oroutine完成工作
func (p *Pool) Shutdown() {
	// 關(guān)閉work所有協(xié)程完成任務(wù)之后會退出for循環(huán)
	close(p.work)
	p.wg.Wait()
}

將上述實現(xiàn)匯總之后如下

work/work.go

package work

import "sync"

// Worker interface 必須滿足worker的要求才能使用工作池
type Worker interface {
	Task()
}

// Pool 提供一個goroutine池,這個池可以完成任何已提交的woker任務(wù)
type Pool struct {
	work chan Worker
	wg   sync.WaitGroup
}

// New 創(chuàng)建一個工作池
func New(maxGoroutine int) *Pool {
	p := Pool{
		work: make(chan Worker),
	}
	p.wg.Add(maxGoroutine)
	for i := 0; i < maxGoroutine; i++ {
		go func() {
			// 一直循環(huán)取任務(wù),直到work被關(guān)閉為止
			for w := range p.work {
				w.Task()
			}
			// 退出時候,減少一個計數(shù)器
			p.wg.Done()
		}()
	}
	return &p
}

// Run 將任務(wù)放入工作池
func (p *Pool) Run(w Worker) {
	p.work <- w
}

// Shutdown 等待所有g(shù)oroutine完成工作
func (p *Pool) Shutdown() {
	// 關(guān)閉work所有協(xié)程完成任務(wù)之后會退出for循環(huán)
	close(p.work)
	p.wg.Wait()
}

對實現(xiàn)的接口進行功能測試

// This sample program demonstrates how to use the work package
// to use a pool of goroutines to get work done.
package main

import (
	"log"
	"sync"
	"time"

	"work"
)

// names provides a set of names to display.
var names = []string{
	"steve",
	"bob",
	"mary",
	"therese",
	"jason",
}

// namePrinter provides special support for printing names.
type namePrinter struct {
	name string
}

// Task implements the Worker interface.
func (m *namePrinter) Task() {
	log.Println(m.name)
	time.Sleep(time.Second)
}

// main is the entry point for all Go programs.
func main() {
	// Create a work pool with 2 goroutines.
	p := work.New(2)

	var wg sync.WaitGroup
	wg.Add(100 * len(names))

	for i := 0; i < 100; i++ {
		// Iterate over the slice of names.
		for _, name := range names {
			// Create a namePrinter and provide the
			// specific name.
			np := namePrinter{
				name: name,
			}

			go func() {
				// Submit the task to be worked on. When RunTask
				// returns we know it is being handled.
				p.Run(&np)
				wg.Done()
			}()
		}
	}

	wg.Wait()

	// Shutdown the work pool and wait for all existing work
	// to be completed.
	p.Shutdown()
}

到此這篇關(guān)于go協(xié)程池實現(xiàn)原理小結(jié)的文章就介紹到這了,更多相關(guān)go 協(xié)程池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Go語言實現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    Go語言實現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法

    這篇文章主要介紹了Go語言實現(xiàn)冒泡排序、選擇排序、快速排序及插入排序的方法,以實例形式詳細分析了幾種常見的排序技巧與實現(xiàn)方法,非常具有實用價值,需要的朋友可以參考下
    2015-02-02
  • golang調(diào)用windows平臺的dll庫的方法實現(xiàn)

    golang調(diào)用windows平臺的dll庫的方法實現(xiàn)

    本文主要介紹了golang調(diào)用windows平臺的dll庫的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-03-03
  • Go語言metrics應(yīng)用監(jiān)控指標基本使用說明

    Go語言metrics應(yīng)用監(jiān)控指標基本使用說明

    這篇文章主要為大家介紹了Go語言metrics應(yīng)用監(jiān)控指標的基本使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 一文帶你掌握Go語言中的文件讀取操作

    一文帶你掌握Go語言中的文件讀取操作

    這篇文章主要和大家分享一下Go語言中的文件讀取操作,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的小伙伴可以參考一下
    2022-12-12
  • Go 高效截取字符串的一些思考

    Go 高效截取字符串的一些思考

    這篇文章主要介紹了Go 高效截取字符串的一些思考,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • Go語言編程實現(xiàn)支持六種級別的日志庫?

    Go語言編程實現(xiàn)支持六種級別的日志庫?

    這篇文章主要為大家介紹了使用Golang編寫一個支持六種級別的日志庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • go 實現(xiàn)簡易端口掃描的示例

    go 實現(xiàn)簡易端口掃描的示例

    該功能實現(xiàn)原理很簡單,就是發(fā)送socket連接(IP+端口),如果能連接成功,說明目標主機開放了某端口。當要大量掃描端口時,就需要寫并發(fā)編程了。
    2021-05-05
  • 淺析Go語言容器之數(shù)組和切片的使用

    淺析Go語言容器之數(shù)組和切片的使用

    在?Java?的核心庫中,集合框架可謂鼎鼎大名:Array?、List、Set等等,隨便拎一個出來都值得開發(fā)者好好學習如何使用甚至是背后的設(shè)計源碼。雖然Go語言沒有如此豐富的容器類型,但也有一些基本的容器供開發(fā)者使用,接下來讓我們認識一下這些容器類型吧
    2022-11-11
  • Go語言錯誤處理異常捕獲+異常拋出

    Go語言錯誤處理異常捕獲+異常拋出

    這篇文章主要介紹了Go語言錯誤處理異常捕獲和異常拋出,Go語言的作者認為java等語言的錯誤處理底層實現(xiàn)較為復(fù)雜,就實現(xiàn)了函數(shù)可以返回錯誤類型以及簡單的異常捕獲,雖然簡單但是也非常精妙,大大的提高了運行效率,下文需要的朋友可以參考一下
    2022-02-02
  • Golang實現(xiàn)根據(jù)某個特定字段對結(jié)構(gòu)體的順序進行排序

    Golang實現(xiàn)根據(jù)某個特定字段對結(jié)構(gòu)體的順序進行排序

    這篇文章主要為大家詳細介紹了Golang如何實現(xiàn)根據(jù)某個特定字段對結(jié)構(gòu)體的順序進行排序,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-03-03

最新評論

屏山县| 买车| 扶风县| 通城县| 京山县| 沾益县| 四子王旗| 吴江市| 富裕县| 台东县| 繁昌县| 沭阳县| 北川| 丽水市| 铁力市| 淮阳县| 和田县| 孟村| 凤翔县| 云安县| 四子王旗| 枣强县| 买车| 乌鲁木齐市| 遵化市| 天津市| 墨玉县| 富阳市| 清水县| 和平县| 亳州市| 西乌| 长岛县| 乌海市| 宁明县| 奎屯市| 汝城县| 开远市| 苏州市| 栾川县| 紫阳县|