Golang 協(xié)程配合管道的實(shí)現(xiàn)示例
請(qǐng)完成goroutine和channel協(xié)同工作的案例,具體要求:
(1)開啟一個(gè)writeData協(xié)程,向管道m(xù)tChan中寫入50個(gè)整數(shù).
(2)開啟一個(gè)readData協(xié)程,從管道intChan中讀取writeData寫入的數(shù)據(jù)。
(3)注意:writeData和readDate操作的是同一個(gè)管道
(4)主線程需要等待writeData和readDate協(xié)程都完成工作才能退出(如果主線程不做處理,那么其他線程還沒干完活就直接跑路了)
管道是引用類型,那么寫入讀取的都是同一個(gè)管道,也就是在不同函數(shù)不同棧里面讀取的都是同一個(gè)管道。兩個(gè)協(xié)程同時(shí)的向管道里面寫入讀取數(shù)據(jù),而不是一個(gè)寫完另外一個(gè)協(xié)程再去讀取。
package main import ( "fmt" ) func writeData(initChan chan int) { for i := 0; i <= 50; i++ { //放入數(shù)據(jù) initChan <- i fmt.Println("write data:", i) } close(initChan) } func readData(initChan chan int, exitChan chan bool) { //即使管道close之后并不影響讀取,當(dāng)在管道當(dāng)中取不到數(shù)據(jù)才會(huì)退出 for { //在從一個(gè)管道里面讀取會(huì)返回兩個(gè)值,ok是有沒有正確讀取到 v, ok := <-initChan if !ok { break } fmt.Println("read data:", v) } //readData任務(wù)完成之后 exitChan <- true close(exitChan) } func main() { //創(chuàng)建兩個(gè)管道 initChan := make(chan int, 50) exitChan := make(chan bool, 1) go writeData(initChan) go readData(initChan, exitChan) for { _, ok := <-exitChan fmt.Println("ok=", ok) if ok { break } } }
如果給的容量就是50,那么循環(huán)50次就剛好放進(jìn)去了。如果管道和放進(jìn)去的數(shù)據(jù)量不匹配,管道的容量小于放進(jìn)去的數(shù)據(jù),又不取出來,那么它就會(huì)阻塞,就會(huì)死鎖。
這個(gè)管道可以容納的數(shù)據(jù)量很小,要寫的數(shù)據(jù)量很大,只要一邊在寫,另外一邊在讀是無所謂的。
如果寫的快,讀取的慢。那么在寫的時(shí)候就會(huì)阻塞,編譯器會(huì)發(fā)現(xiàn)雖然阻塞了,但是有另外一個(gè)協(xié)程在往里面讀取數(shù)據(jù),這樣就不會(huì)發(fā)生死鎖。
func producer(ch chan int) { i := 0 for { ch <- i i++ } } func main() { ch := make(chan int, 2) go producer(ch) for { fmt.Println(<-ch) time.Sleep(time.Second * 2) } } 0 1 2 3 4 5 6 7 進(jìn)程 已完成,退出代碼為 -1073741510 (0xC000013A: interrupted by Ctrl+C)
死鎖編譯器底層會(huì)分析,如果發(fā)現(xiàn)一個(gè)地方在不停的寫,但是沒有任何一個(gè)協(xié)程去讀取這樣就直接死鎖,如果有一個(gè)協(xié)程在慢慢的讀取這樣不會(huì)死鎖。和寫入讀取速度沒有關(guān)系,但是必須有寫入的協(xié)程和讀取的協(xié)程。簡而言之就是管道需要不停的流動(dòng)。
到此這篇關(guān)于Golang 協(xié)程配合管道的文章就介紹到這了,更多相關(guān)Golang 協(xié)程配合管道內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你使用Golang實(shí)現(xiàn)SSH客戶端
SSH?全稱為?Secure?Shell,是一種用于安全地遠(yuǎn)程登錄到網(wǎng)絡(luò)上的其他計(jì)算機(jī)的網(wǎng)絡(luò)協(xié)議,本文主要為大家詳細(xì)介紹了如何使用?Golang?實(shí)現(xiàn)?SSH?客戶端,需要的可以參考下2023-11-11Golang常用環(huán)境變量說明與設(shè)置詳解
這篇文章主要介紹了Golang常用環(huán)境變量說明與設(shè)置,需要的朋友可以參考下2020-02-02基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能
最近項(xiàng)目開發(fā)中有涉及到Excel的導(dǎo)入與導(dǎo)出功能,特別是導(dǎo)出表格時(shí)需要特定的格式,所以本文給大家介紹了基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能,文中通過代碼示例和圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Golang實(shí)現(xiàn)Md5校驗(yàn)的代碼示例
最近項(xiàng)目中有個(gè)需求,就是地圖文件下發(fā)后,接收方需要文件的md5值,和接收到的文件做比對(duì),以免文件不完整,引起bug,于是測試了下本地文件和遠(yuǎn)程文件的md5計(jì)算,所以本文給大家介紹了Golang實(shí)現(xiàn)Md5校驗(yàn),需要的朋友可以參考下2024-07-07Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因
這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11