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

4個(gè)場(chǎng)景教會(huì)你Go中Goroutine和通道是怎么用的

 更新時(shí)間:2023年05月26日 10:28:19   作者:不背鍋運(yùn)維  
本篇給出了4個(gè)在運(yùn)維開發(fā)工作中較為常見的且也是比較典型的場(chǎng)景,通過這些場(chǎng)景來帶大家掌握Go中Goroutine和通道是怎么使用的,需要的可以學(xué)習(xí)一下

開篇

這段時(shí)間把主要精力都放在了K8S上,差點(diǎn)把Golang給忘了。那本篇就分享一下并發(fā)相關(guān)的內(nèi)容(Goroutine和通道)。 本篇給出4個(gè)場(chǎng)景,這4個(gè)場(chǎng)景是在運(yùn)維開發(fā)工作中較為常見的且也是比較典型的場(chǎng)景。通過這些代碼示例,讓你知道Goroutine和通道在運(yùn)維開發(fā)中是怎么應(yīng)用的??偠灾?,言而總之,當(dāng)涉及到處理并發(fā)和并行任務(wù)時(shí),Goroutine和通道是非常強(qiáng)悍的,可以讓我們開發(fā)出高效的、牛逼的并發(fā)程序。

實(shí)戰(zhàn)場(chǎng)景

1.并發(fā)執(zhí)行任務(wù)的場(chǎng)景

場(chǎng)景:假設(shè)需要編寫一個(gè)程序,用于批量執(zhí)行某個(gè)操作(例如部署應(yīng)用程序、更新配置等)到多臺(tái)服務(wù)器上。

供參考的代碼示例:

package?main

import?(
?"fmt"
?"sync"
)

//?服務(wù)器結(jié)構(gòu)體
type?Server?struct?{
?Name?string
?//?其他服務(wù)器相關(guān)的字段
}

//?執(zhí)行任務(wù)的函數(shù)
func?executeTask(server?Server,?task?string)?{
?//?連接服務(wù)器并執(zhí)行任務(wù)的邏輯
?fmt.Printf("執(zhí)行任務(wù)?[%s]?到服務(wù)器?[%s]\n",?task,?server.Name)
?//?執(zhí)行操作的代碼
}

func?main()?{
?//?服務(wù)器列表
?servers?:=?[]Server{
??{Name:?"Server1"},
??{Name:?"Server2"},
??{Name:?"Server3"},
??//?添加更多的服務(wù)器
?}

?//?任務(wù)列表
?tasks?:=?[]string{"部署應(yīng)用程序",?"更新配置",?"執(zhí)行命令",?"其他任務(wù)"}

?//?創(chuàng)建一個(gè)任務(wù)通道,用于發(fā)送任務(wù)到Goroutine池
?taskChannel?:=?make(chan?string)

?//?創(chuàng)建一個(gè)等待組,用于等待所有Goroutine執(zhí)行完畢
?var?wg?sync.WaitGroup
?wg.Add(len(servers))

?//?啟動(dòng)Goroutine池
?for?_,?server?:=?range?servers?{
??go?func(server?Server)?{
???//?標(biāo)記任務(wù)完成時(shí),通知等待組減少一個(gè)計(jì)數(shù)
???defer?wg.Done()

???//?從任務(wù)通道中接收任務(wù),并執(zhí)行
???for?task?:=?range?taskChannel?{
????executeTask(server,?task)
???}
??}(server)
?}

?//?將任務(wù)發(fā)送到任務(wù)通道
?for?_,?task?:=?range?tasks?{
??taskChannel?<-?task
?}

?//?關(guān)閉任務(wù)通道,表示所有任務(wù)都已發(fā)送
?close(taskChannel)

?//?等待所有Goroutine執(zhí)行完畢
?wg.Wait()
}

上面的代碼,創(chuàng)建了一個(gè)Goroutine池,每個(gè)Goroutine代表一臺(tái)服務(wù)器,通過通道將任務(wù)分發(fā)給Goroutine進(jìn)行并發(fā)執(zhí)行。每個(gè)Goroutine負(fù)責(zé)連接到服務(wù)器,并執(zhí)行相應(yīng)的操作。這樣可以加速任務(wù)的執(zhí)行,同時(shí)提高資源利用率。

2.并發(fā)日志處理的場(chǎng)景

場(chǎng)景:假設(shè)需要將大量的日志數(shù)據(jù)并發(fā)地寫入到不同的目標(biāo)中(例如文件、數(shù)據(jù)庫(kù)、消息隊(duì)列等)。

供參考的代碼示例:

package?main

import?(
?"fmt"
?"log"
?"os"
?"sync"
)

//?日志結(jié)構(gòu)體
type?Log?struct?{
?Message?string
?//?其他日志相關(guān)的字段
}

func?main()?{
?//?創(chuàng)建一個(gè)日志通道,用于發(fā)送日志數(shù)據(jù)
?logChannel?:=?make(chan?Log)

?//?創(chuàng)建一個(gè)等待組,用于等待所有Goroutine執(zhí)行完畢
?var?wg?sync.WaitGroup

?//?啟動(dòng)一個(gè)Goroutine處理日志寫入操作
?wg.Add(1)
?go?func()?{
??//?標(biāo)記日志寫入完畢時(shí),通知等待組減少一個(gè)計(jì)數(shù)
??defer?wg.Done()

??//?打開文件進(jìn)行日志寫入
??file,?err?:=?os.OpenFile("log.txt",?os.O_APPEND|os.O_CREATE|os.O_WRONLY,?0644)
??if?err?!=?nil?{
???log.Fatal(err)
??}
??defer?file.Close()

??//?創(chuàng)建一個(gè)日志寫入器
??logger?:=?log.New(file,?"",?log.LstdFlags)

??//?從日志通道中接收日志數(shù)據(jù),并寫入到目標(biāo)中
??for?log?:=?range?logChannel?{
???logger.Println(log.Message)
??}
?}()

?//?并發(fā)地向日志通道發(fā)送日志數(shù)據(jù)
?for?i?:=?0;?i?<?10;?i++?{
??wg.Add(1)
??go?func(index?int)?{
???//?標(biāo)記發(fā)送完日志數(shù)據(jù)時(shí),通知等待組減少一個(gè)計(jì)數(shù)
???defer?wg.Done()

???//?構(gòu)造日志數(shù)據(jù)
???log?:=?Log{
????Message:?fmt.Sprintf("日志消息?%d",?index),
????//?設(shè)置其他日志字段
???}

???//?發(fā)送日志數(shù)據(jù)到日志通道
???logChannel?<-?log
??}(i)
?}

?//?關(guān)閉日志通道,表示所有日志數(shù)據(jù)都已發(fā)送
?close(logChannel)

?//?等待日志寫入操作的Goroutine執(zhí)行完畢
?wg.Wait()
}

在上面的代碼中,使用了一個(gè)專門的Goroutine來處理日志寫入操作,該Goroutine從一個(gè)日志通道中讀取日志數(shù)據(jù),并將其寫入到目標(biāo)中。其他的Goroutine可以并發(fā)地向該通道發(fā)送日志數(shù)據(jù),而不會(huì)因?yàn)閷懭氩僮鞫枞?/p>

3.異步任務(wù)調(diào)度的場(chǎng)景

在實(shí)際的運(yùn)維工作中,有種場(chǎng)景是需要按照一定的調(diào)度策略異步執(zhí)行一些任務(wù)。比如這樣的場(chǎng)景:定期備份數(shù)據(jù)庫(kù)、定時(shí)清理無(wú)效數(shù)據(jù)等。

供參考的代碼示例:

package?main

import?(
?"fmt"
?"time"
)

//?執(zhí)行任務(wù)的函數(shù)
func?executeTask(task?string)?{
?//?執(zhí)行任務(wù)的邏輯
?fmt.Println("執(zhí)行任務(wù):",?task)
?//?具體的任務(wù)操作代碼
}

func?main()?{
?//?創(chuàng)建一個(gè)定時(shí)器,每隔一段時(shí)間觸發(fā)一次
?timer?:=?time.NewTimer(5?*?time.Second)

?//?啟動(dòng)一個(gè)Goroutine等待定時(shí)器的觸發(fā)事件
?go?func()?{
??//?等待定時(shí)器的觸發(fā)事件
??<-timer.C
??//?定時(shí)器觸發(fā)后執(zhí)行任務(wù)
??executeTask("定時(shí)任務(wù)1")
??//?重新設(shè)置定時(shí)器,以實(shí)現(xiàn)循環(huán)調(diào)度
??timer.Reset(10?*?time.Second)
?}()

?//?主線程繼續(xù)執(zhí)行其他任務(wù)
?//?...

?//?阻塞主線程,保持程序運(yùn)行
?select?{}
}

4.并發(fā)任務(wù)協(xié)作的場(chǎng)景

在某些情況下,你可能需要多個(gè)Goroutine之間進(jìn)行協(xié)作和同步。例如,一個(gè)Goroutine負(fù)責(zé)生產(chǎn)任務(wù),而另一個(gè)Goroutine負(fù)責(zé)消費(fèi)任務(wù)并進(jìn)行處理。你可以使用通道來實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者模型。生產(chǎn)者將任務(wù)發(fā)送到通道中,而消費(fèi)者從通道中接收任務(wù)并進(jìn)行處理。通過這種方式,可以實(shí)現(xiàn)任務(wù)的有效分配和協(xié)同處理。

package?main

import?(
?"fmt"
?"time"
)

//?任務(wù)結(jié)構(gòu)體
type?Task?struct?{
?ID???int
?Data?string
?//?其他任務(wù)相關(guān)的字段
}

//?生產(chǎn)者,負(fù)責(zé)生產(chǎn)任務(wù)并發(fā)送到通道
func?producer(ch?chan<-?Task)?{
?for?i?:=?1;?i?<=?10;?i++?{
??task?:=?Task{
???ID:???i,
???Data:?fmt.Sprintf("任務(wù)?%d",?i),
???//?設(shè)置其他任務(wù)字段
??}
??ch?<-?task
??fmt.Println("生產(chǎn)任務(wù):",?task.Data)
??time.Sleep(500?*?time.Millisecond)?//?模擬生產(chǎn)任務(wù)的耗時(shí)
?}
?close(ch)?//?關(guān)閉通道,表示所有任務(wù)都已生產(chǎn)完畢
}

//?消費(fèi)者,負(fù)責(zé)從通道接收任務(wù)并進(jìn)行處理
func?consumer(ch?<-chan?Task)?{
?for?task?:=?range?ch?{
??fmt.Println("消費(fèi)任務(wù):",?task.Data)
??//?執(zhí)行任務(wù)的處理邏輯
??time.Sleep(1?*?time.Second)?//?模擬處理任務(wù)的耗時(shí)
?}
}

func?main()?{
?//?創(chuàng)建一個(gè)任務(wù)通道,用于生產(chǎn)者和消費(fèi)者之間的通信
?taskChannel?:=?make(chan?Task)

?//?啟動(dòng)生產(chǎn)者Goroutine
?go?producer(taskChannel)

?//?啟動(dòng)多個(gè)消費(fèi)者Goroutine
?for?i?:=?1;?i?<=?3;?i++?{
??go?consumer(taskChannel)
?}

?//?阻塞主線程,保持程序運(yùn)行
?select?{}
}

在上面的代碼種,使用了定時(shí)器(time.Timer)結(jié)合Goroutine來實(shí)現(xiàn)異步任務(wù)調(diào)度。通過啟動(dòng)一個(gè)Goroutine來等待定時(shí)器的觸發(fā)事件,并執(zhí)行相應(yīng)的任務(wù)。這樣可以在后臺(tái)自動(dòng)執(zhí)行任務(wù),而不需要阻塞主線程。

到此這篇關(guān)于4個(gè)場(chǎng)景教會(huì)你Go中Goroutine和通道是怎么用的的文章就介紹到這了,更多相關(guān)Go Goroutine通道內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言中的iota關(guān)鍵字的使用

    Go語(yǔ)言中的iota關(guān)鍵字的使用

    這篇文章主要介紹了Go語(yǔ)言中的iota關(guān)鍵字的使用的相關(guān)資料,需要的朋友可以參考下
    2023-08-08
  • Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例

    Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例

    這篇文章主要介紹了Go語(yǔ)言下載網(wǎng)絡(luò)圖片或文件的方法示例,文中通過示例代碼介紹的非常詳細(xì),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • 一文帶你了解Go中的內(nèi)存對(duì)齊

    一文帶你了解Go中的內(nèi)存對(duì)齊

    一旦涉及到較為底層的編程,特別是與硬件交互,內(nèi)存對(duì)齊是一個(gè)必修的課題,所以這篇文章小編就想來和大家聊一聊Go語(yǔ)言中的內(nèi)存對(duì)齊,希望對(duì)大家有所幫助
    2023-10-10
  • gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼

    Gorm是Go語(yǔ)言的ORM框架,提供一套對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查的接口,本文主要介紹了gin+gorm實(shí)現(xiàn)goweb項(xiàng)目的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-03-03
  • go使用golangci-lint實(shí)現(xiàn)自動(dòng)化代碼檢查

    go使用golangci-lint實(shí)現(xiàn)自動(dòng)化代碼檢查

    golangci-lint的自動(dòng)化代碼檢查方案,幫助開發(fā)者在開發(fā)過程中及時(shí)發(fā)現(xiàn)并修復(fù)代碼問題,本文將詳細(xì)介紹使用golangci-lint實(shí)現(xiàn)自動(dòng)化代碼檢查,具有一定的參考價(jià)值,感興趣的可以了解一下
    2026-04-04
  • Golang基于JWT與Casbin身份驗(yàn)證授權(quán)實(shí)例詳解

    Golang基于JWT與Casbin身份驗(yàn)證授權(quán)實(shí)例詳解

    這篇文章主要為大家介紹了Golang基于JWT與Casbin實(shí)現(xiàn)身份驗(yàn)證授權(quán)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 深入了解Go語(yǔ)言中sync.Pool的使用

    深入了解Go語(yǔ)言中sync.Pool的使用

    本文將介紹?Go?語(yǔ)言中的?sync.Pool并發(fā)原語(yǔ),包括sync.Pool的基本使用方法、使用注意事項(xiàng)等的內(nèi)容,對(duì)我們了解Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-04-04
  • GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例

    GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例

    這篇文章主要為大家介紹了GO中使用谷歌GEMINI模型任務(wù)代碼實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • go new和make的區(qū)別以及為什么new返回的是指針問題分析

    go new和make的區(qū)別以及為什么new返回的是指針問題分析

    Go語(yǔ)言中new和make的區(qū)別在于:new用于分配值類型內(nèi)存并返回指針,適用于所有值類型;make用于創(chuàng)建并初始化slice、map和channel,只適用于引用類型,new返回指針可以明確表示值是在堆上分配的,避免不必要的值拷貝,并且與零值初始化語(yǔ)義一致
    2026-01-01
  • Golang time.Format時(shí)間格式化的實(shí)現(xiàn)

    Golang time.Format時(shí)間格式化的實(shí)現(xiàn)

    Go語(yǔ)言的time.Format使用一個(gè)固定的參考時(shí)間來定義格式,本文就來介紹一下Golang time.Format時(shí)間格式化的實(shí)現(xiàn),感興趣的可以了解一下
    2026-04-04

最新評(píng)論

宜兰市| 乌海市| 绥棱县| 石景山区| 基隆市| 福鼎市| 来宾市| 泰来县| 林州市| 肇东市| 成武县| 茌平县| 浮山县| 稻城县| 大英县| 长葛市| 台安县| 宜章县| 内江市| 凌源市| 富阳市| 观塘区| 当阳市| 鄢陵县| 班玛县| 永泰县| 北安市| 临清市| 江都市| 大石桥市| 晋宁县| 正安县| 黔西| 资溪县| 铜梁县| 德保县| 克拉玛依市| 丰顺县| 阳新县| 长沙市| 吉林省|