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

Go routine使用方法講解

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

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

方法一:讓主goroutine "sleep"一段時間

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

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

方法二:使用通道,使用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{}類型值的表示法只有一個,即:struct{}{}。并且它占用的內(nèi)存空間是0字節(jié),確切地說,這個值在整個GO程序中永遠(yuǎn)都只會存在一份。

方法三:使用sync.WaitGroup

待補(bǔ)充。

二、怎么讓多個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語句是很有必要的
			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àn)椋篏o 調(diào)度器在需要的時候只會對正在運(yùn)行的 goroutine 發(fā)出通知,試圖讓它停下來。但是,它卻不會也不能強(qiáng)行讓一個 goroutine 停下來。

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

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

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

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

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

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

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

相關(guān)文章

  • GoFrame?gtree樹形結(jié)構(gòu)的使用技巧示例

    GoFrame?gtree樹形結(jié)構(gòu)的使用技巧示例

    這篇文章主要為大家介紹了GoFrame?gtree樹形結(jié)構(gòu)的使用技巧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • GO語言入門Golang進(jìn)入HelloWorld

    GO語言入門Golang進(jìn)入HelloWorld

    本篇文章是go語言基礎(chǔ)篇,非常適合go語言剛?cè)腴T的小白,主要介紹了GO語言入門Golang進(jìn)入HelloWorld,跟著小編一起來編寫Go語言的第一程序helloworld吧
    2021-09-09
  • Golang 1.16 中 Modules的主要變化更新

    Golang 1.16 中 Modules的主要變化更新

    這篇文章主要介紹了Golang 1.16 中 Modules的主要變化更新,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • go語言接口用法實(shí)例分析

    go語言接口用法實(shí)例分析

    這篇文章主要介紹了go語言接口用法,實(shí)例分析了Go語言接口的定義及使用技巧,需要的朋友可以參考下
    2015-03-03
  • Go語言入門13之runtime包案例講解

    Go語言入門13之runtime包案例講解

    這篇文章主要介紹了Go語言入門runtime包相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Go語言實(shí)現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解

    Go語言實(shí)現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解

    這篇文章主要介紹了Go語言實(shí)現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解,圖文代碼聲情并茂,有感興趣的可以學(xué)習(xí)下
    2021-03-03
  • Golang中接收者方法語法糖的使用方法詳解

    Golang中接收者方法語法糖的使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Golang中接收者方法語法糖的使用方法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-05-05
  • Golang跳轉(zhuǎn)語句continue與goto使用語法詳解

    Golang跳轉(zhuǎn)語句continue與goto使用語法詳解

    這篇文章主要介紹了Golang跳轉(zhuǎn)語句continue與goto使用語法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • Go?常見設(shè)計模式之單例模式詳解

    Go?常見設(shè)計模式之單例模式詳解

    單例模式是設(shè)計模式中最簡單的一種模式,單例模式能夠確保無論對象被實(shí)例化多少次,全局都只有一個實(shí)例存在,在Go?語言有多種方式可以實(shí)現(xiàn)單例模式,所以我們今天就來一起學(xué)習(xí)下吧
    2023-07-07
  • 淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    淺析Go語言中的map數(shù)據(jù)結(jié)構(gòu)是如何實(shí)現(xiàn)的

    在?Go?中,map?是一種用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),它提供了一種快速查找和訪問數(shù)據(jù)的方式,下面我們就來看看Go語言中是如何實(shí)現(xiàn)map數(shù)據(jù)結(jié)構(gòu)的吧
    2024-03-03

最新評論