国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang 并發(fā)編程詳解

這篇具有很好參考價(jià)值的文章主要介紹了Golang 并發(fā)編程詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Golang 并發(fā)編程詳解

介紹

并發(fā)是現(xiàn)代軟件開(kāi)發(fā)中的一個(gè)重要概念,它允許程序同時(shí)執(zhí)行多個(gè)任務(wù),提高系統(tǒng)的性能和響應(yīng)能力。Golang 是一門天生支持并發(fā)的語(yǔ)言,它通過(guò) goroutine 和 channel 提供了強(qiáng)大的并發(fā)編程支持。

在本文中,我們將深入探討 Golang 中的并發(fā)編程,了解 goroutine、channel 以及一些常見(jiàn)的并發(fā)模式。

Goroutine

Goroutine 是 Golang 中的輕量級(jí)線程,由 Go 運(yùn)行時(shí)系統(tǒng)調(diào)度。它們比傳統(tǒng)的線程更輕便,創(chuàng)建和銷毀的代價(jià)更小,使得在程序中創(chuàng)建成千上萬(wàn)個(gè) goroutine 變得實(shí)際可行。

創(chuàng)建 Goroutine

在 Golang 中創(chuàng)建 goroutine 非常簡(jiǎn)單。只需在函數(shù)調(diào)用前使用關(guān)鍵字 go 就可以將其包裝成 goroutine。

package main

import (
	"fmt"
	"sync"
	"time"
)

func printNumbers() {
	for i := 1; i <= 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Printf("%d ", i)
	}
}

func main() {
	go printNumbers()

	// 主 goroutine 不等待 printNumbers 完成
	time.Sleep(1 * time.Second)

	fmt.Println("Main goroutine")
}

上述代碼中,printNumbers 函數(shù)被包裝成一個(gè) goroutine,并在 main 函數(shù)中異步執(zhí)行。time.Sleep(1 * time.Second) 用于等待足夠的時(shí)間,確保 printNumbers 有足夠的時(shí)間打印數(shù)字。注意,主 goroutine 并不會(huì)等待 printNumbers 執(zhí)行完畢。

Channel

Channel 是 Golang 中用于在 goroutine 之間傳遞數(shù)據(jù)的管道。它提供了一種同步的方式,確保數(shù)據(jù)安全地在 goroutine 之間傳遞。

創(chuàng)建 Channel

在 Golang 中,使用 make 函數(shù)創(chuàng)建 channel。

ch := make(chan int)

上述代碼創(chuàng)建了一個(gè)整數(shù)類型的無(wú)緩沖 channel。無(wú)緩沖 channel 在發(fā)送數(shù)據(jù)和接收數(shù)據(jù)時(shí)都會(huì)阻塞,直到另一方準(zhǔn)備好。

使用 Channel

package main

import (
	"fmt"
	"sync"
	"time"
)

func printNumbers(ch chan int, wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 1; i <= 5; i++ {
		time.Sleep(100 * time.Millisecond)
		ch <- i
	}
	close(ch)
}

func main() {
	ch := make(chan int)
	var wg sync.WaitGroup

	wg.Add(1)
	go printNumbers(ch, &wg)

	for num := range ch {
		fmt.Printf("%d ", num)
	}

	fmt.Println("Main goroutine")
	wg.Wait()
}

上述代碼中,printNumbers 將數(shù)字通過(guò) channel 發(fā)送給主 goroutine,并在發(fā)送完畢后關(guān)閉 channel。主 goroutine 使用 for num := range ch 循環(huán)接收 channel 中的數(shù)據(jù),直到 channel 被關(guān)閉。同時(shí),使用等待組(sync.WaitGroup)確保所有 goroutine 執(zhí)行完畢后主 goroutine 才結(jié)束。

并發(fā)模式

除了簡(jiǎn)單的 goroutine 和 channel 的使用外,Golang 還提供了一些常見(jiàn)的并發(fā)模式,如等待組、互斥鎖等。這些模式幫助我們更好地組織和管理并發(fā)代碼。

等待組

等待組(WaitGroup)用于等待一組 goroutine 執(zhí)行完畢。它通過(guò)計(jì)數(shù)器實(shí)現(xiàn),每個(gè) goroutine 執(zhí)行前遞增計(jì)數(shù)器,執(zhí)行完畢后遞減計(jì)數(shù)器。主 goroutine 調(diào)用 Wait 方法等待計(jì)數(shù)器歸零。

package main

import (
	"fmt"
	"sync"
	"time"
)

func printNumbers(wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 1; i <= 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Printf("%d ", i)
	}
}

func main() {
	var wg sync.WaitGroup

	wg.Add(1)
	go printNumbers(&wg)

	wg.Wait()
	fmt.Println("Main goroutine")
}

互斥鎖

互斥鎖(Mutex)用于保護(hù)共享資源,防止多個(gè) goroutine 同時(shí)訪問(wèn)導(dǎo)致的競(jìng)態(tài)條件。

package main

import (
	"fmt"
	"sync"
	"time"
)

var counter = 0
var mutex sync.Mutex

func increment(wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 0; i < 1000; i++ {
		mutex.Lock()
		counter++
		mutex.Unlock()
	}
}

func main() {
	var wg sync.WaitGroup

	wg.Add(2)
	go increment(&wg)
	go increment(&wg)

	wg.Wait()
	fmt.Printf("Final Counter: %d\n", counter)
}

上述代碼中,兩個(gè) goroutine 并發(fā)地增加 counter 變量的值,使用互斥鎖 sync.Mutex 來(lái)保護(hù)臨界區(qū),確保同一時(shí)刻只有一個(gè) goroutine 能夠訪問(wèn)。

使用 Select 處理多 Channel

在一些場(chǎng)景中,我們可能需要同時(shí)處理多個(gè) channel,Golang 中提供了 select 語(yǔ)句來(lái)實(shí)現(xiàn)。

package main

import (
	"fmt"
	"time"
)

func producer(ch chan int, wg *sync.WaitGroup) {
	defer wg.Done()

	for i := 1; i <= 5; i++ {
		time.Sleep(100 * time.Millisecond)
		ch <- i
	}
	close(ch)
}

func consumer(ch1, ch2 chan int, wg *sync.WaitGroup) {
	defer wg.Done()

	for {
		select {
		case num, ok := <-ch1:
			if ok {
				fmt.Printf("From ch1: %d\n", num)
			}
		case num, ok := <-ch2:
			if ok {
				fmt.Printf("From ch2: %d\n", num)
			}
		}
	}
}

func main() {
	ch1 := make(chan int)
	ch2 := make(chan int)
	var wg sync.WaitGroup

	wg.Add(2)
	go producer(ch1, &wg)
	go producer(ch2, &wg)



	go consumer(ch1, ch2, &wg)

	wg.Wait()
	fmt.Println("Main goroutine")
}

上述代碼中,consumer 函數(shù)通過(guò) select 同時(shí)監(jiān)聽(tīng)兩個(gè) channel(ch1ch2),一旦其中一個(gè) channel 有數(shù)據(jù),就進(jìn)行處理。這種方式非常適用于處理多個(gè) channel 的情況。

結(jié)語(yǔ)

通過(guò)本文,我們深入了解了 Golang 中的并發(fā)編程,包括 goroutine、channel 以及一些常見(jiàn)的并發(fā)模式。并發(fā)編程使得 Golang 在處理高并發(fā)任務(wù)時(shí)表現(xiàn)出色,開(kāi)發(fā)者可以通過(guò)合理使用并發(fā)特性來(lái)提高程序性能。

希望讀者通過(guò)本文的學(xué)習(xí),能更好地應(yīng)用 Golang 中的并發(fā)編程,構(gòu)建高效、穩(wěn)定的軟件系統(tǒng)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-819408.html

到了這里,關(guān)于Golang 并發(fā)編程詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Golang Channel詳解:安全并發(fā)通信與避免死鎖方法

    深入了解Golang中的Channel,探討其線程安全性、類型特性以及避免死鎖的方法。學(xué)習(xí)如何正確初始化、存取數(shù)據(jù),關(guān)閉Channel以及處理只讀只寫情況。

    2024年02月10日
    瀏覽(27)
  • Golang單元測(cè)試與Goroutine詳解 | 并發(fā)、MPG模式及CPU利用

    深入探討Golang中單元測(cè)試方法及Goroutine的使用。了解并發(fā)與并行概念,MPG模式以及CPU相關(guān)函數(shù)的應(yīng)用。解決協(xié)程并行中的資源競(jìng)爭(zhēng)問(wèn)題。

    2024年02月10日
    瀏覽(45)
  • Go語(yǔ)言(Golang)數(shù)據(jù)庫(kù)編程

    要想連接到 SQL 數(shù)據(jù)庫(kù),首先需要加載目標(biāo)數(shù)據(jù)庫(kù)的驅(qū)動(dòng),驅(qū)動(dòng)里面包含著于該數(shù)據(jù)庫(kù)交互的邏輯。 sql.Open() 數(shù)據(jù)庫(kù)驅(qū)動(dòng)的名稱 數(shù)據(jù)源名稱 得到一個(gè)指向 sql.DB 這個(gè) struct 的指針 sql.DB 是用來(lái)操作數(shù)據(jù)庫(kù)的,它代表了0個(gè)或者多個(gè)底層連接的池,這些連接由sql 包來(lái)維護(hù),sql 包會(huì)

    2024年02月03日
    瀏覽(93)
  • 【云原生 | 37】Docker快速部署編程語(yǔ)言Golang

    【云原生 | 37】Docker快速部署編程語(yǔ)言Golang

    ?? 博主簡(jiǎn)介 : ??????????云計(jì)算領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 ??????????新星計(jì)劃第三季python賽道第一名 ??????????阿里云ACE認(rèn)證高級(jí)工程師 ??????????阿里云開(kāi)發(fā)者社區(qū)專家博主 ?? 博主微信 :15575411187 ?? 交流社區(qū) :小鵬linux(個(gè)人社區(qū))歡迎您的加入! 目錄

    2024年02月01日
    瀏覽(45)
  • Golang vs Java: 一場(chǎng)編程語(yǔ)言的較量

    在IT行業(yè)飛速發(fā)展的過(guò)程中,編程語(yǔ)言扮演著至關(guān)重要的角色。作為開(kāi)發(fā)人員,選擇合適的編程語(yǔ)言對(duì)于構(gòu)建高效、可靠和可維護(hù)的應(yīng)用程序至關(guān)重要。在這場(chǎng)編程語(yǔ)言的較量中,Golang和Java無(wú)疑是兩個(gè)備受青睞的選擇。我們現(xiàn)在將對(duì)這兩種語(yǔ)言進(jìn)行全面對(duì)比,探討它們?cè)谛阅堋⒑?jiǎn)潔

    2024年04月17日
    瀏覽(29)
  • Golang vs Rust ——服務(wù)端編程應(yīng)該選擇哪種語(yǔ)言

    Golang vs Rust ——服務(wù)端編程應(yīng)該選擇哪種語(yǔ)言

    為服務(wù)端編程選擇一種語(yǔ)言應(yīng)該基于你的長(zhǎng)期目標(biāo)和項(xiàng)目的要求,因此,盲目地問(wèn)我應(yīng)該雇用 Go 開(kāi)發(fā)人員還是應(yīng)該選擇 Rust 進(jìn)行開(kāi)發(fā)并不能幫助你解決問(wèn)題。 然而,如果你發(fā)現(xiàn)自己陷入了困境,那么這篇文章將為你解惑。下面讓我們開(kāi)始吧。 Go 是一種靜態(tài)類型的、AOT 編譯的

    2024年02月02日
    瀏覽(41)
  • 【Golang星辰圖】數(shù)據(jù)管理利器:Go編程語(yǔ)言中的數(shù)據(jù)庫(kù)和搜索引擎綜合指南

    Go編程語(yǔ)言是一種強(qiáng)大、類型安全且高效的編程語(yǔ)言,它在處理數(shù)據(jù)庫(kù)和搜索引擎方面有著廣泛的應(yīng)用。本篇文章將詳細(xì)介紹幾個(gè)Go編程語(yǔ)言中常用的數(shù)據(jù)庫(kù)和全文搜索引擎,包括Go-bleve、Go-pgx、Go-leveldb/leveldb、Go-xorm、Go-mysql-driver和Go-bbolt/bbolt。對(duì)于每個(gè)工具,我們將介紹其功

    2024年03月26日
    瀏覽(109)
  • golang 并發(fā)

    Golang 并發(fā) 并行 指的是在同一時(shí)刻 有多條指令在多個(gè)CPU處理器上同時(shí)執(zhí)行 2個(gè)任務(wù)2個(gè)窗口需要硬件支持 并發(fā)是指在同一時(shí)刻 只能有一條指令 單多個(gè)進(jìn)程指令快速輪換執(zhí)行 2個(gè)隊(duì)伍1個(gè)窗口 要求提升軟件能力 Golang 并發(fā)優(yōu)勢(shì) go 從底層就支持并發(fā) 簡(jiǎn)化了并發(fā)程序的編寫方法 Go

    2024年02月03日
    瀏覽(15)
  • golang并發(fā)安全-select

    golang并發(fā)安全-select

    前面說(shuō)了golang的channel,?今天我們看看golang select 是怎么實(shí)現(xiàn)的。 select 非默認(rèn)的case 中都是處理channel 的 接受和發(fā)送,所有scase 結(jié)構(gòu)體中c是用來(lái)存儲(chǔ)select 的case中使用的channel 編譯器在中間代碼生成期間會(huì)根據(jù) select 中 case 的不同對(duì)控制語(yǔ)句進(jìn)行優(yōu)化,這一過(guò)程都發(fā)生在cmd/c

    2024年01月23日
    瀏覽(17)
  • Golang 并發(fā) Channel的用法

    上面是創(chuàng)建了無(wú)緩沖的 channel,一旦有 goroutine 往 channel 發(fā)送數(shù)據(jù),那么當(dāng)前的 goroutine 會(huì)被阻塞住,直到有其他的 goroutine 消費(fèi)了 channel 里的數(shù)據(jù),才能繼續(xù)運(yùn)行。 上面示例中的第二個(gè)參數(shù)表示 channel 可緩沖數(shù)據(jù)的容量。只要當(dāng)前 channel 里的元素總數(shù)不大于這個(gè)可緩沖容量,

    2024年02月21日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包