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

Go routine使用方法講解

 更新時(shí)間:2023年01月09日 11:54:28   作者:鯤鵬飛九萬(wàn)里  
goroutine是Go語(yǔ)言提供的語(yǔ)言級(jí)別的輕量級(jí)線程,在我們需要使用并發(fā)時(shí),我們只需要通過(guò)go關(guān)鍵字來(lái)開(kāi)啟goroutine即可。這篇文章主要介紹了GoLang并發(fā)機(jī)制goroutine原理,感興趣的可以了解一下

一、怎么才能讓主goroutine等待其它goroutine

方法一:讓主goroutine "sleep"一段時(shí)間

func main() {
	for i := 0; i < 10; i++ {
		go func(i int) {
			fmt.Println(i)
		}(i)
	}
	time.Sleep(time.Microsecond * 100)
}

缺點(diǎn)是:睡眠的時(shí)間很難把握。

方法二:使用通道,使用chan struct{}類型

func main() {
	num := 10
	var ch = make(chan struct{}, num)
	for i := 0; i < num; i++ {
		go func(i int) {
			fmt.Println(i)
			ch <- struct{}{}
		}(i)
	}
	for i := 0; i < num; i++ {
		<-ch
	}
}

類型字面量struct{}有些類似空接口類型interface{},它代表了即不包含任何字段也不擁有任何方法的空結(jié)構(gòu)體類型。

struct{}類型值的表示法只有一個(gè),即:struct{}{}。并且它占用的內(nèi)存空間是0字節(jié),確切地說(shuō),這個(gè)值在整個(gè)GO程序中永遠(yuǎn)都只會(huì)存在一份。

方法三:使用sync.WaitGroup

待補(bǔ)充。

二、怎么讓多個(gè)goroutine按照既定的順序運(yùn)行

package main
import (
	"fmt"
	"sync/atomic"
	"time"
)
func main() {
	num := uint32(100)
	var count uint32 = 0
	trigger := func(i uint32, fn func()) {
		for {
			if atomic.LoadUint32(&count) == i {
				fn()
				atomic.AddUint32(&count, 1)
				break
			}
			// 這里加Sleep語(yǔ)句是很有必要的
			time.Sleep(time.Microsecond)
		}
	}
	for i := uint32(0); i < num; i++ {
		go func(i uint32) {
			fn := func() {
				fmt.Println(i)
			}
			trigger(i, fn)
		}(i)
	}
	trigger(num, func() {})
}

這里的trigger函數(shù)實(shí)現(xiàn)了一種自旋(spining)。

上面的自旋中添加了time.Sleep(time.Microsecond)語(yǔ)句:

這主要是因?yàn)椋篏o 調(diào)度器在需要的時(shí)候只會(huì)對(duì)正在運(yùn)行的 goroutine 發(fā)出通知,試圖讓它停下來(lái)。但是,它卻不會(huì)也不能強(qiáng)行讓一個(gè) goroutine 停下來(lái)。

所以,如果一條 for 語(yǔ)句過(guò)于簡(jiǎn)單的話,比如這里的 for 語(yǔ)句就很簡(jiǎn)單(因?yàn)槔锩嬷挥幸粭l if 語(yǔ)句),那么當(dāng)前的 goroutine 就可能不會(huì)去正常響應(yīng)(或者說(shuō)沒(méi)有機(jī)會(huì)響應(yīng))Go 調(diào)度器的停止通知。

因此,這里加一個(gè) sleep 是為了:在任何情況下(如任何版本的 Go、任何計(jì)算平臺(tái)下的 Go、任何的 CPU 核心數(shù)等),內(nèi)含這條 for 語(yǔ)句的這些 goroutine 都能夠正常地響應(yīng)停止通知。

不加Sleep語(yǔ)句,可能會(huì)導(dǎo)致一直搶占不到資源,也就沒(méi)有機(jī)會(huì)運(yùn)行,就可能會(huì)導(dǎo)致程序一直運(yùn)行,不會(huì)終止。

樂(lè)觀鎖:總是假設(shè)在“我”操作共享資源的過(guò)程中沒(méi)有“其他人”競(jìng)爭(zhēng)操作。如果發(fā)現(xiàn)“其他人”確實(shí)在此期間競(jìng)爭(zhēng)了,也就是發(fā)現(xiàn)假設(shè)失敗,那就等一等再操作。CAS原子操作基本上能夠體現(xiàn)出這種思想。通常,低頻的并發(fā)操作適合用樂(lè)觀鎖。樂(lè)觀鎖一般會(huì)用比較輕量級(jí)的同步方法(如原子操作),但也不是100%。注意,高頻的操作用樂(lè)觀鎖的話反而有可能影響性能,因?yàn)槎嗔艘徊?ldquo;探查是否有人與我競(jìng)爭(zhēng)”的操作(當(dāng)然了,標(biāo)準(zhǔn)的CAS操作可以把這種影響降到最低)。

悲觀鎖:總是假設(shè)在“我”操作共享資源的過(guò)程中一定有“其他人”競(jìng)爭(zhēng)操作。所以“我”會(huì)先用某種同步方法(如互斥鎖)保護(hù)我的操作。這樣的話,“我”在將要操作的時(shí)候就沒(méi)必要去探查是否有人與我競(jìng)爭(zhēng)(因?yàn)?ldquo;我”總是假設(shè)肯定有競(jìng)爭(zhēng),而且已經(jīng)做好了保護(hù))。通常,頻次較高的并發(fā)操作適合用悲觀鎖。不過(guò),如果并發(fā)操作的頻次非常低,用悲觀鎖也是可以的,因?yàn)檫@種情況下對(duì)性能影響不大。

最后,一定要注意,使用任何同步方法和異步方法都首先要考慮程序的正確性,并且還要考慮程序的性能。程序的正確性一定要靠功能測(cè)試來(lái)保障,程序的性能一定要靠性能測(cè)試來(lái)保障。

到此這篇關(guān)于Go routine使用方法講解的文章就介紹到這了,更多相關(guān)Go routine內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解簡(jiǎn)單高效的Go?struct優(yōu)化

    詳解簡(jiǎn)單高效的Go?struct優(yōu)化

    這篇文章主要為大家介紹了簡(jiǎn)單高效的Go?struct優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 簡(jiǎn)單易用的Go逗號(hào)comma ok模式使用詳解

    簡(jiǎn)單易用的Go逗號(hào)comma ok模式使用詳解

    這篇文章主要為大家介紹了簡(jiǎn)單易用的Go逗號(hào)comma ok模式使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 使用Go語(yǔ)言實(shí)現(xiàn)谷歌翻譯功能

    使用Go語(yǔ)言實(shí)現(xiàn)谷歌翻譯功能

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語(yǔ)言實(shí)現(xiàn)谷歌翻譯功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下
    2024-02-02
  • 基于Golang實(shí)現(xiàn)Redis協(xié)議解析器

    基于Golang實(shí)現(xiàn)Redis協(xié)議解析器

    這篇文章主要為大家詳細(xì)介紹了如何通過(guò)GO語(yǔ)言編寫簡(jiǎn)單的Redis協(xié)議解析器,文中的示例代碼講解詳細(xì),對(duì)我們深入了解Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-03-03
  • 在Go中構(gòu)建并發(fā)TCP服務(wù)器

    在Go中構(gòu)建并發(fā)TCP服務(wù)器

    今天小編就為大家分享一篇關(guān)于在Go中構(gòu)建并發(fā)TCP服務(wù)器的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • Go工具鏈之代碼測(cè)試神器go?test詳解

    Go工具鏈之代碼測(cè)試神器go?test詳解

    這篇文章主要給大家介紹Go?工具鏈go?test,go?test?是?Go?工具鏈中的一個(gè)命令,用于編譯和運(yùn)行按照要求編寫的?Golang?測(cè)試代碼,并生成測(cè)試報(bào)告,感興趣的同學(xué)跟著小編一起來(lái)看看本文吧
    2023-07-07
  • 一文帶你搞懂Golang如何正確退出Goroutine

    一文帶你搞懂Golang如何正確退出Goroutine

    在Go語(yǔ)言中,Goroutine是一種輕量級(jí)線程,它的退出機(jī)制對(duì)于并發(fā)編程至關(guān)重要,下午就來(lái)介紹幾種Goroutine的退出機(jī)制,希望對(duì)大家有所幫助
    2023-06-06
  • 在Golang中使用C語(yǔ)言代碼實(shí)例

    在Golang中使用C語(yǔ)言代碼實(shí)例

    這篇文章主要介紹了在Golang中使用C語(yǔ)言代碼實(shí)例,本文先是給出了一個(gè)Hello World例子、Golang 引用 C例子,并總結(jié)了一些要注意的地方,需要的朋友可以參考下
    2014-10-10
  • Golang?Mutex?原理詳細(xì)解析

    Golang?Mutex?原理詳細(xì)解析

    這篇文章主要介紹了Golang?Mutex原理詳細(xì)解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • 在Gin框架中解決跨域問(wèn)題的多種方法

    在Gin框架中解決跨域問(wèn)題的多種方法

    在使用Go語(yǔ)言進(jìn)行Web開(kāi)發(fā)時(shí),Gin框架因其簡(jiǎn)潔、高效的特點(diǎn)而被廣泛使用,然而,在實(shí)際開(kāi)發(fā)中,跨域問(wèn)題(CORS, Cross-Origin Resource Sharing)是一個(gè)常見(jiàn)的挑戰(zhàn),本文將結(jié)合實(shí)際案例,詳細(xì)介紹在Gin框架中解決跨域問(wèn)題的多種方法,需要的朋友可以參考下
    2024-10-10

最新評(píng)論

贡觉县| 赤城县| 南丹县| 格尔木市| 叶城县| 特克斯县| 凤庆县| 黔西县| 综艺| 闵行区| 乐都县| 健康| 浦县| 韶关市| 昌宁县| 志丹县| 白河县| 墨玉县| 高雄市| 富锦市| 高密市| 博乐市| 寻乌县| 嘉禾县| 称多县| 博湖县| 双流县| 临沧市| 米易县| 德格县| 八宿县| 眉山市| 湄潭县| 永修县| 兰溪市| 南宫市| 马关县| 林甸县| 普洱| 白朗县| 临朐县|