欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 協(xié)程配合管道的實(shí)現(xiàn)示例

 更新時(shí)間:2024年01月11日 11:09:35   作者:富士康質(zhì)檢員張全蛋  
本文主要介紹了Golang協(xié)程配合管道的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

請(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客戶端

    一文帶你使用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-11
  • Goland的設(shè)置與配置全過程

    Goland的設(shè)置與配置全過程

    這篇文章主要介紹了Goland的設(shè)置與配置全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解Go內(nèi)存模型

    詳解Go內(nèi)存模型

    這篇文章主要介紹了Go 內(nèi)存模型的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Golang常用環(huán)境變量說明與設(shè)置詳解

    Golang常用環(huán)境變量說明與設(shè)置詳解

    這篇文章主要介紹了Golang常用環(huán)境變量說明與設(shè)置,需要的朋友可以參考下
    2020-02-02
  • 基于Golang實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出功能

    基于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-12
  • go語言中的defer關(guān)鍵字

    go語言中的defer關(guān)鍵字

    這篇文章介紹了go語言中的defer關(guān)鍵字,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Golang實(shí)現(xiàn)Md5校驗(yàn)的代碼示例

    Golang實(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-07
  • Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因

    Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因

    這篇文章主要為大家介紹了Go?模塊在下游服務(wù)抖動(dòng)恢復(fù)后CPU占用無法恢復(fù)原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 一文了解Go語言中的函數(shù)與方法的用法

    一文了解Go語言中的函數(shù)與方法的用法

    與大部分語言一致,Go語言中的函數(shù)與方法定義與其他語言基本一致,但也有一定的差別。本文將通過示例詳細(xì)講講Go語言中函數(shù)與方法的用法,感興趣的可以學(xué)習(xí)一下
    2022-07-07
  • Golang使用pprof檢查內(nèi)存泄漏的全過程

    Golang使用pprof檢查內(nèi)存泄漏的全過程

    pprof 是golang提供的一款分析工具,可以分析CPU,內(nèi)存的使用情況,本篇文章關(guān)注它在分析內(nèi)存泄漏方面的應(yīng)用,本文給大家介紹了Golang使用pprof檢查內(nèi)存泄漏的全過程,文中通過代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02

最新評(píng)論