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

golang并發(fā)編程中Goroutine 協(xié)程的實現(xiàn)

 更新時間:2024年10月22日 10:34:34   作者:怪我冷i  
Go語言中的協(xié)程是一種輕量級線程,通過在函數(shù)前加go關(guān)鍵字來并發(fā)執(zhí)行,具有動態(tài)棧、快速啟動和低內(nèi)存使用等特點,本文就來詳細的介紹一下,感興趣的可以了解一下

Go 協(xié)程(Goroutine)是 Go 語言提供的一種輕量級線程,由 Go 運行時來管理。是與其他函數(shù)同時運行的函數(shù),它們是并發(fā)執(zhí)行代碼的基礎(chǔ)。

在函數(shù)調(diào)用前加上 go 關(guān)鍵字,這次調(diào)用就會在一個新的 goroutine 中并發(fā)執(zhí)行。當(dāng)被調(diào)用的函數(shù)返回時,這個 goroutine 也自動結(jié)束。

需要注意的是,如果這個函數(shù)有返回值,那么這個返回值會被丟棄。

Go 協(xié)程(Goroutine)之間通過通道(channel)進行通信,簡單的說就是多個協(xié)程之間通信的管道。通道可以防止多個協(xié)程訪問共享內(nèi)存時發(fā)生資源爭搶的問題。

啟動 Goroutine

要啟動一個新的 Goroutine,只需要在函數(shù)調(diào)用前加上 go 關(guān)鍵字。例如:

這行代碼會啟動一個新的 Goroutine 來執(zhí)行 myFunction。

Goroutine 的特性

  • 輕量級:Goroutine 比傳統(tǒng)線程更輕量級。每個 Goroutine 使用的內(nèi)存非常少,啟動速度也更快。
  • 調(diào)度:Goroutine 由 Go 運行時管理和調(diào)度,而不是操作系統(tǒng)。
  • 棧管理:Goroutine 的棧是動態(tài)增長的,初始大小一般較?。ㄈ?2KB),但可以根據(jù)需要動態(tài)擴展,最大可達 1GB。

同步和通信

在 Go 中,同步和通信通常通過通道(channel)來實現(xiàn)。通道是 Go 語言提供的一種類型安全的通信機制。

創(chuàng)建通道

可以使用 make 函數(shù)創(chuàng)建通道:

發(fā)送和接收

使用 <- 操作符可以發(fā)送和接收數(shù)據(jù):

// 發(fā)送數(shù)據(jù)到通道
ch <- 42
// 從通道接收數(shù)據(jù)
value := <-ch

帶緩沖的通道

創(chuàng)建帶緩沖的通道:

ch := make(chan int, 100)

這樣通道可以在不阻塞發(fā)送 Goroutine 的情況下緩沖一定數(shù)量的數(shù)據(jù)。

示例代碼

以下是一個簡單的 Goroutine 和通道的示例:

package main
import (
 "fmt"
 "time"
)

func worker(ch chan int) {
 for i := 0; i < 5; i++ {
 ch <- i
 time.Sleep(time.Second)
 }
 close(ch)
}

func main() {
 ch := make(chan int)
 go worker(ch)
 for val := range ch {
 fmt.Println(val)
 }
}

在這個例子中,worker 函數(shù)向通道 ch 發(fā)送數(shù)據(jù),然后 main 函數(shù)從通道 ch 接收數(shù)據(jù)并打印。

Goroutines 和主程序

需要注意的是,如果主程序退出,所有未完成的 Goroutines 也會立即終止。因此,通常需要確保主程序等待所有 Goroutines 完成。例如,可以使用 sync.WaitGroup 來實現(xiàn)這一點:

package main

import (
 "fmt"
 "sync"
)

func worker(wg *sync.WaitGroup, id int) {
 defer wg.Done()
 fmt.Printf("Worker %d starting\n", id)
 // 模擬工作
 time.Sleep(time.Second)
 fmt.Printf("Worker %d done\n", id)
}

func main() {
 var wg sync.WaitGroup
 for i := 1; i <= 5; i++ {
 wg.Add(1)
 go worker(&wg, i)
 }
 wg.Wait()
 fmt.Println("All workers done")
}

這個示例使用 sync.WaitGroup 來等待所有的 Goroutines 完成。wg.Add(1) 用于增加計數(shù),wg.Done() 在 Goroutine 完成時減少計數(shù),wg.Wait() 則阻塞直到所有的 Goroutines 完成。

協(xié)程、線程、進程

協(xié)程、線程和進程是并發(fā)和并行編程中的三種主要概念。它們有不同的特性和適用場景,以下是它們的主要區(qū)別:

進程 (Process)

定義

  • 進程是操作系統(tǒng)中資源分配的基本單位。
  • 每個進程都有自己的內(nèi)存空間、文件描述符和其他資源。

特點

  • 隔離性:進程之間是相互獨立的,一個進程的崩潰不會影響其他進程。
  • 開銷大:進程之間切換的開銷較大,需要保存和恢復(fù)大量上下文信息。
  • 通信復(fù)雜:進程間通信(IPC,如管道、消息隊列、共享內(nèi)存等)相對復(fù)雜。

適用場景

  • 適用于需要高度隔離和獨立運行的任務(wù)。
  • 適用于不同編程語言和不同平臺之間的并發(fā)處理。

線程 (Thread)

定義

  • 線程是進程中的一個執(zhí)行單元,屬于進程的一部分。
  • 同一進程中的線程共享該進程的內(nèi)存和其他資源。

特點

  • 輕量級:相比進程,線程的創(chuàng)建和切換開銷較小。
  • 共享資源:同一進程內(nèi)的線程可以直接訪問共享的內(nèi)存和資源,但也因此帶來了同步問題。
  • 并發(fā)執(zhí)行:多個線程可以在多核 CPU 上并發(fā)執(zhí)行。

適用場景

  • 適用于需要并行處理的任務(wù),如多線程服務(wù)器、并行計算等。
  • 適用于需要頻繁切換和低開銷的場景。

協(xié)程 (Coroutine)

定義

  • 協(xié)程是一種用戶態(tài)的輕量級線程,也稱為微線程或纖程。
  • 協(xié)程由程序自身管理調(diào)度,而不是操作系統(tǒng)。

特點

  • 更輕量級:協(xié)程的創(chuàng)建和切換開銷更小,因為不涉及內(nèi)核態(tài)的切換。
  • 協(xié)作式調(diào)度:協(xié)程通過顯式的讓出操作(如 yield)來切換,控制權(quán)由程序員掌握。
  • 共享內(nèi)存:同一線程內(nèi)的協(xié)程可以共享內(nèi)存,但需要注意同步問題。

適用場景

  • 適用于 I/O 密集型任務(wù),如高并發(fā)網(wǎng)絡(luò)服務(wù)器。
  • 適用于需要大量并發(fā)但對并行性要求不高的場景,如爬蟲、異步編程等。

總結(jié)

  • 進程:資源隔離好,開銷大,適用于獨立運行的任務(wù)。
  • 線程:資源共享,開銷較小,適用于需要并行處理的任務(wù)。
  • 協(xié)程:更輕量級,用戶態(tài)調(diào)度,適用于大量并發(fā)的 I/O 密集型任務(wù)。

各自的選擇主要取決于具體的應(yīng)用場景和性能需求。協(xié)程在現(xiàn)代編程中越來越受歡迎,尤其是在需要高并發(fā)和高效 I/O 操作的場景中。

到此這篇關(guān)于golang并發(fā)編程中Goroutine 協(xié)程的實現(xiàn)的文章就介紹到這了,更多相關(guān)golang Goroutine 協(xié)程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語言WaitGroup使用時需要注意的坑

    Go語言WaitGroup使用時需要注意的坑

    Go語言中WaitGroup的用途是它能夠一直等到所有的goroutine執(zhí)行完成,并且阻塞主線程的執(zhí)行,直到所有的goroutine執(zhí)行完成。之前一直使用也沒有問題,但最近通過同事的一段代碼引起了關(guān)于WaitGroup的注意,下面這篇文章就介紹了WaitGroup使用時需要注意的坑及填坑。
    2016-12-12
  • Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體

    Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體

    這篇文章主要介紹了Golang如何編寫內(nèi)存高效及CPU調(diào)優(yōu)的Go結(jié)構(gòu)體,結(jié)構(gòu)體是包含多個字段的集合類型,用于將數(shù)據(jù)組合為記錄
    2022-07-07
  • Golang實現(xiàn)請求限流的幾種辦法(小結(jié))

    Golang實現(xiàn)請求限流的幾種辦法(小結(jié))

    這篇文章主要介紹了Golang實現(xiàn)請求限流的幾種辦法(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Golang?流水線設(shè)計模式實踐示例詳解

    Golang?流水線設(shè)計模式實踐示例詳解

    這篇文章主要為大家介紹了Golang?流水線設(shè)計模式實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 使用Go實現(xiàn)偽靜態(tài)URL重寫功能

    使用Go實現(xiàn)偽靜態(tài)URL重寫功能

    在Web開發(fā)中,偽靜態(tài)URL已成為優(yōu)化網(wǎng)站架構(gòu)和提升SEO的常用技術(shù)手段,偽靜態(tài)URL是一種介于動態(tài)URL和靜態(tài)URL之間的解決方案,本文給大家介紹了如何使用Go實現(xiàn)偽靜態(tài)URL重寫功能,需要的朋友可以參考下
    2024-08-08
  • Go語言使用Gob傳輸數(shù)據(jù)

    Go語言使用Gob傳輸數(shù)據(jù)

    本文主要介紹了Go語言使用Gob傳輸數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go Gin 處理跨域問題解決

    Go Gin 處理跨域問題解決

    在前后端分離的項目中,經(jīng)常會遇到跨域問題,本文主要介紹了Go Gin 處理跨域問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05
  • go語言題解LeetCode228匯總區(qū)間示例詳解

    go語言題解LeetCode228匯總區(qū)間示例詳解

    這篇文章主要為大家介紹了go語言題解LeetCode228匯總區(qū)間示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式

    使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式

    文章介紹使用Wireshark抓取ping數(shù)據(jù)包并保存為pcap格式,通過Go語言gopacket解析,提取IP版本號、指定標(biāo)識的數(shù)據(jù)包長度及應(yīng)用層ICMP字符串內(nèi)容,展示TCP/IP協(xié)議族解析的簡便方法
    2025-07-07
  • Go語言使用context控制協(xié)程取消的方法步驟

    Go語言使用context控制協(xié)程取消的方法步驟

    本文將通過一個實際案例,使用?context?控制協(xié)程的取消,避免資源泄露,實現(xiàn)優(yōu)雅退出,具有一定的參考價值,感興趣的可以了解一下
    2025-08-08

最新評論