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

Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例

 更新時(shí)間:2022年06月29日 08:26:57   作者:爪哇盤(pán)古  
本文主要介紹了Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

首先就是進(jìn)程、線程、協(xié)程講解老三樣。

進(jìn)程: 本質(zhì)上是一個(gè)獨(dú)立執(zhí)行的程序,進(jìn)程是操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本概念,操作系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位。

線程: 是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程執(zhí)行不同的任務(wù),切換受系統(tǒng)控制。

協(xié)程:  又稱為微線程,是一種用戶態(tài)的輕量級(jí)線程,協(xié)程不像線程和進(jìn)程需要進(jìn)行系統(tǒng)內(nèi)核上的上下文切換,協(xié)程的上下文切換是由用戶自己決定的,有自己的上下文,所以說(shuō)是輕量級(jí)的線程,也稱之為用戶級(jí)別的線程就叫協(xié)程,一個(gè)線程可以多個(gè)協(xié)程,線程進(jìn)程都是同步機(jī)制,而協(xié)程則是異步Java的原生語(yǔ)法中并沒(méi)有實(shí)現(xiàn)協(xié)程,目前python、Lua和GO等語(yǔ)言支持。

關(guān)系:一個(gè)進(jìn)程可以有多個(gè)線程,它允許計(jì)算機(jī)同時(shí)運(yùn)行兩個(gè)或多個(gè)程序。線程是進(jìn)程的最小執(zhí)行單位,CPU
的調(diào)度切換的是進(jìn)程和線程,進(jìn)程和線程多了之后調(diào)度會(huì)消耗大量的CPU,CPU上真正運(yùn)行的是線程,線程可
以對(duì)應(yīng)多個(gè)協(xié)程。

MPG模型

Go協(xié)程中有三個(gè)關(guān)鍵實(shí)體:

  • M(machine): 工作線程,由操作系統(tǒng)調(diào)度。應(yīng)該就是通常所說(shuō)的內(nèi)核線程。
  • P(processor): 處理器(非CPU),代表著運(yùn)行Go代碼的必要資源,以及調(diào)度goroutine的能力。個(gè)人覺(jué)得可以當(dāng)作擁有自主調(diào)度權(quán)的算法模塊,用于工作竊?。╳ork stealing)。
  • G(gooutine): Go協(xié)程,輕量級(jí)用戶線程。主要包含執(zhí)行棧調(diào)度管理器。這里的調(diào)度管理器指的是,統(tǒng)一并管理調(diào)度資源,等待被調(diào)度。

Go協(xié)程的特點(diǎn)

(1)有獨(dú)立的棧空間

(2)共享程序的堆空間

(3)協(xié)程調(diào)度由用戶控制(進(jìn)程的控制是有操作系統(tǒng)控制,程序員不能控制)

(4)協(xié)程是輕量級(jí)的線程

通道的特性

Go語(yǔ)言中的通道(channel)是一種特殊的類(lèi)型。在任何時(shí)候,同時(shí)只能有一個(gè) goroutine 訪問(wèn)通道進(jìn)行發(fā)送和獲取數(shù)據(jù)。goroutine 間通過(guò)通道就可以通信。

通道像一個(gè)傳送帶或者隊(duì)列,總是遵循先入先出(First In First Out)的規(guī)則,保證收發(fā)數(shù)據(jù)的順序。

當(dāng)然協(xié)程的輕量性并不代表可以隨意濫用,畢竟還是存在資源的消耗。本文主要講解go的協(xié)程池的實(shí)現(xiàn)原理,利用select來(lái)監(jiān)聽(tīng)任務(wù)?!敬a僅用作實(shí)現(xiàn)原理,想更優(yōu)雅可以在該原理基礎(chǔ)上自行優(yōu)化】

廢話不多說(shuō)直接上代碼!

package main
 
import (
	"strconv"
	"time"
)
 
/**
協(xié)程池
 */
//全局任務(wù)管道地址數(shù)組
var arr []*chan func()
//啟動(dòng)任務(wù)數(shù)量
var num = 10
//默認(rèn)管道下標(biāo)0
var index = 0
//任務(wù)開(kāi)關(guān)
var static = false
func run(f *chan func()){
	println("等待咯")
	for static == true {
		select {
			case fu:=<-*f :     // 檢測(cè)有沒(méi)有數(shù)據(jù)可讀
				// 一旦成功讀取到數(shù)據(jù),則進(jìn)行該case處理語(yǔ)句
				fu()
			default:
				//println(f)
				//println("無(wú)數(shù)據(jù)")
		}
		time.Sleep(time.Duration(1)*time.Second)
	}
}
//啟動(dòng)任務(wù)函數(shù)
func Start(){
	static = true
	for i:=0;i<num;i++ {
		//make一個(gè)管道地址
		c:=make(chan func(),1)
		println(&c)
		//將該地址存入全局?jǐn)?shù)組中
		arr = append(arr,&c)
		//地址傳入任務(wù)函數(shù)
		go run(&c)
	}
}
//插入任務(wù)
func add(str string) {
	//此處不是很優(yōu)雅,自行優(yōu)化實(shí)現(xiàn)。
	if(index >= num-1){
		index = 0
	}else{
		index++
	}
	//向地址管道傳入函數(shù)
	*arr[index] <- func() {
		println(str)
	}
}
//停止任務(wù)
func stop()  {
	//終止任務(wù)for
	static = false
	//清空管道數(shù)組
	arr = []*chan func(){}
}
func main() {
	Start()
	println("開(kāi)始執(zhí)行寫(xiě)入管道")
	println(len(arr))
	for i:=0;i<1000000000;i++ {
		add("傳入的i:"+strconv.Itoa(i))
	}
	time.Sleep(time.Duration(2)*time.Second)
	stop()
	//time.Sleep(time.Duration(100)*time.Second)
}

原理很簡(jiǎn)單,就是合理使用select來(lái)監(jiān)聽(tīng)管道是否有數(shù)據(jù),協(xié)程池的實(shí)現(xiàn)就是合理利用管道。可以根據(jù)該思路來(lái)進(jìn)行優(yōu)化封裝一個(gè)屬于自己的協(xié)程池哦~

到此這篇關(guān)于Go簡(jiǎn)單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go 協(xié)程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 完美解決go Fscanf 在讀取文件時(shí)出現(xiàn)的問(wèn)題

    完美解決go Fscanf 在讀取文件時(shí)出現(xiàn)的問(wèn)題

    這篇文章主要介紹了完美解決go Fscanf 在讀取文件時(shí)出現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例

    golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了golang?gorm的關(guān)系關(guān)聯(lián)實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go并發(fā)編程sync.Cond的具體使用

    Go并發(fā)編程sync.Cond的具體使用

    Go 標(biāo)準(zhǔn)庫(kù)提供 Cond 原語(yǔ)的目的是,為等待 / 通知場(chǎng)景下的并發(fā)問(wèn)題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-05-05
  • 詳解Golang編程中的常量與變量

    詳解Golang編程中的常量與變量

    這篇文章主要介紹了詳解Golang編程中的常量與變量,是Go語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介

    golang結(jié)構(gòu)化日志log/slog包之slog.Record的用法簡(jiǎn)介

    這篇文章主要為大家詳細(xì)介紹了golang結(jié)構(gòu)化日志log/slog包中slog.Record結(jié)構(gòu)體的使用方法和需要注意的點(diǎn),文中的示例代碼講解詳細(xì),需要的可以學(xué)習(xí)一下
    2023-10-10
  • Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解

    Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解

    在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下
    2023-03-03
  • Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例

    本篇文章主要介紹了Golang 統(tǒng)計(jì)字符串字?jǐn)?shù)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Go中Vendo機(jī)制的使用

    Go中Vendo機(jī)制的使用

    自Go1.6起,Go語(yǔ)言正式啟用vendor機(jī)制,允許將項(xiàng)目依賴放入項(xiàng)目?jī)?nèi)的vendor目錄,類(lèi)似私有GOPATH,本文就來(lái)介紹一下Vendo機(jī)制的使用,感興趣的可以了解一下
    2024-10-10
  • Go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)簡(jiǎn)單分布式系統(tǒng)

    Go語(yǔ)言實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)簡(jiǎn)單分布式系統(tǒng)

    如今很多云原生系統(tǒng)、分布式系統(tǒng),例如?Kubernetes,都是用?Go?語(yǔ)言寫(xiě)的,這是因?yàn)?Go?語(yǔ)言天然支持異步編程。本篇文章將介紹如何用?Go?語(yǔ)言編寫(xiě)一個(gè)簡(jiǎn)單的分布式系統(tǒng),需要的小伙伴開(kāi)業(yè)跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法

    Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法

    Go鏈接庫(kù)系統(tǒng)的難用可謂是人盡皆知,不同Go版本編譯出來(lái)的不兼容,而且只支持GNU的,不能編譯出Windows上的dll和lib。這篇文章給大家介紹Go編譯32位GNU靜態(tài)鏈接庫(kù)的方法,感興趣的朋友一起看看吧
    2020-05-05

最新評(píng)論

金昌市| 枝江市| 崇左市| 工布江达县| 奈曼旗| 武隆县| 湾仔区| 搜索| 屏东县| 鄯善县| 海原县| 陇南市| 南投县| 巨野县| 科技| 潍坊市| 托克逊县| 贞丰县| 九台市| 汝阳县| 毕节市| 武威市| 鞍山市| 宝丰县| 邻水| 镇沅| 文昌市| 册亨县| 安龙县| 冷水江市| 龙陵县| 莫力| 高台县| 津南区| 夏河县| 贵南县| 炉霍县| 湘潭市| 琼结县| 涿鹿县| 瓮安县|