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

Go并發(fā)快速入門(mén):Goroutine

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

Go并發(fā):Goroutine

1.并發(fā)基礎(chǔ)概念:進(jìn)程、線程、協(xié)程

(1) 進(jìn)程

可以比作食材加工的一系列動(dòng)作

進(jìn)程就是程序在操作系統(tǒng)中的一次執(zhí)行過(guò)程,是由系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,進(jìn)程是一個(gè)動(dòng)態(tài)概念,是程序在執(zhí)行過(guò)程中分配和管理資源的基本單位,每一個(gè)進(jìn)程都有一個(gè)自己的地址空間。一個(gè)進(jìn)程至少有5種基本狀態(tài):初始態(tài)、執(zhí)行態(tài)、等待狀態(tài)、就緒狀態(tài)、終止?fàn)顟B(tài)。

通俗講: 進(jìn)程就是一個(gè)正在執(zhí)行的程序。

[一般情況] 一個(gè)程序一個(gè)進(jìn)程

[多進(jìn)程]] 一個(gè)程序多個(gè)進(jìn)程

可以在終端輸入以下內(nèi)容,來(lái)列出所有的進(jìn)程

ps -A

比如在Windows系統(tǒng)中,一個(gè)運(yùn)行的xx.exe就是一個(gè)進(jìn)程。

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

(2) 線程

可以比作食材加工的某一個(gè)動(dòng)作

線程是運(yùn)算調(diào)度的最小單元,是進(jìn)程中的一個(gè)執(zhí)行任務(wù)(控制單元),負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。一個(gè)進(jìn)程至少有一個(gè)線程,一個(gè)進(jìn)程可以運(yùn)行多個(gè)線程,多個(gè)線程可共享數(shù)據(jù)。

進(jìn)程與線程的區(qū)別如下

根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位

資源開(kāi)銷:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷;線程可以看做輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開(kāi)銷小。

包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。

內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的

影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。

執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行

查看線程

  1. 進(jìn)入 terminal
  2. 輸入命令 ps-M[pid]
  3. 查看對(duì)應(yīng) pid 線程
(3) 協(xié)程

協(xié)程(goroutine) 是輕量級(jí)的執(zhí)行線程。

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端
Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

實(shí)操

假設(shè)我們有一個(gè)函數(shù)叫做 action()。 我們一般會(huì)這樣 同步地 調(diào)用它使用 go action() 在一個(gè)協(xié)程中調(diào)用這個(gè)函數(shù)。 這個(gè)新的 Go 協(xié)程將會(huì) 并發(fā)地 執(zhí)行這個(gè)函數(shù)。

package main 

import (
	"fmt"
	// "time"
)

func action() {
	fmt.Println("Test Goroutine")
}

func main() {
	go action()

	// time.Sleep(2 * time.Second)
}

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

可見(jiàn)咩有任何輸出,把注釋內(nèi)容取消注釋再運(yùn)行

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

為什么要沉睡?

go 語(yǔ)言運(yùn)行非???,若沒(méi)有沉睡,可能會(huì)導(dǎo)致

“協(xié)程還沒(méi)有執(zhí)行完, main 函數(shù)已經(jīng)結(jié)束了”

最終導(dǎo)致協(xié)程結(jié)束前, main 函數(shù)已經(jīng)被銷毀

因此我們需要讓主進(jìn)程去等待一定時(shí)間的子協(xié)程,才能得到子協(xié)程的輸出

2.多協(xié)程核心機(jī)理

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

步驟

  • 任務(wù)切片/分配
  • 啟動(dòng)多個(gè)協(xié)程
  • 合并多個(gè)協(xié)程結(jié)果

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

使用場(chǎng)景

  • 運(yùn)算量比較多
  • 協(xié)程間依賴性比較弱

3.多協(xié)程等待實(shí)操

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

我們可以使用通道來(lái)同步協(xié)程之間的執(zhí)行狀態(tài)。使用 wait group 等待多個(gè)協(xié)程完成

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 2; i ++ {
		wg.Add(1)
		go func(num int) {
			fmt.Printf("Goroutine Test %d\n", num)
			wg.Done()
		}(i)
	}

	wg.Wait()
}

Go并發(fā)快速入門(mén):Goroutine,6.824,golang,開(kāi)發(fā)語(yǔ)言,后端

更多細(xì)節(jié)清查閱 waitgroup

Go by Example 中文版: WaitGroup (gobyexample-cn.github.io)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-815154.html

到了這里,關(guān)于Go并發(fā)快速入門(mén):Goroutine的文章就介紹完了。如果您還想了解更多內(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單元測(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)
  • 「實(shí)驗(yàn)記錄」MIT 6.824 Raft Lab2A Leader Election

    「實(shí)驗(yàn)記錄」MIT 6.824 Raft Lab2A Leader Election

    MIT-6.824 2020 課程官網(wǎng) Lab2: Raft 實(shí)驗(yàn)主頁(yè) simviso 精品付費(fèi)翻譯 MIT 6.824 課程 source code 的 Gitee 地址 Lab2A: Leader Election 的 Gitee 地址 課程官網(wǎng)提供的 Lab 代碼下載地址,我沒(méi)有訪問(wèn)成功,于是我從 Github 其他用戶那里 clone 到干凈的源碼,有需要可以訪問(wèn)我的 Gitee 獲取 提出 Raft 的主要

    2024年02月05日
    瀏覽(57)
  • Golang中的管道(channel) 、goroutine與channel實(shí)現(xiàn)并發(fā)、單向管道、select多路復(fù)用以及goroutine panic處理

    Golang中的管道(channel) 、goroutine與channel實(shí)現(xiàn)并發(fā)、單向管道、select多路復(fù)用以及goroutine panic處理

    目錄 管道(channel) 無(wú)緩沖管道 有緩沖管道 需要注意 goroutine與channel實(shí)現(xiàn)并發(fā) 單向管道 定義單向管道 將雙向管道轉(zhuǎn)換為單向管道 單向管道作為函數(shù)參數(shù) 單向管道的代碼示例 select多路復(fù)用 案例演示 goroutine panic處理 案例演示 管道(channel)是 Go 語(yǔ)言中實(shí)現(xiàn)并發(fā)的一種方式,

    2024年02月06日
    瀏覽(24)
  • 「實(shí)驗(yàn)記錄」MIT 6.824 KVRaft Lab3B With Log Compaction

    MIT-6.824 2020 課程官網(wǎng) Lab3: KVRaft 實(shí)驗(yàn)主頁(yè) simviso 精品付費(fèi)翻譯 MIT 6.824 課程 Paper - Raft extended version source code 的 Gitee 地址 Lab3B: KVRaft with log compaction的 Gitee 地址 課程官網(wǎng)提供的 Lab 代碼下載地址,我沒(méi)有訪問(wèn)成功,于是我從 Github 其他用戶那里 clone 到干凈的源碼,有需要可以訪

    2024年02月15日
    瀏覽(51)
  • Go并發(fā)編程 Goroutine、Channel、Select、Mutex鎖、sync、Atomic等

    Go并發(fā)編程 Goroutine、Channel、Select、Mutex鎖、sync、Atomic等

    本文所有實(shí)例代碼運(yùn)行g(shù)o版本: go version go1.18.10 windows/amd64 串行:所有任務(wù)一件一件做,按照事先的順序依次執(zhí)行,沒(méi)有被執(zhí)行到的任務(wù)只能等待。最終執(zhí)行完的時(shí)間等于各個(gè)子任務(wù)之和。 并發(fā):是以交替的方式利用 等待 某個(gè)任務(wù)的時(shí)間來(lái)處理其他任務(wù)計(jì)算邏輯,在計(jì)算機(jī)

    2024年02月07日
    瀏覽(22)
  • Go語(yǔ)言入門(mén)12(協(xié)程 goroutine)

    進(jìn)程 ?當(dāng)運(yùn)行一個(gè)應(yīng)用程序的時(shí)候,操作系統(tǒng)會(huì)為這個(gè)應(yīng)用程序啟動(dòng)一個(gè)進(jìn)程??梢詫⑦@個(gè)進(jìn)程看作一個(gè)包含了應(yīng)用程序在運(yùn)行中需要用到和維護(hù)的各種資源的容器。這些資源包括但不限于內(nèi)存地址空間、文件和設(shè)備的句柄以及線程 線程 ?一個(gè)線程是一個(gè)執(zhí)行空間,這個(gè)空

    2023年04月26日
    瀏覽(28)
  • Golang掃盲式學(xué)習(xí)——GO并發(fā) | (一)

    Golang掃盲式學(xué)習(xí)——GO并發(fā) | (一)

    并行:同一個(gè)時(shí)間段內(nèi)多個(gè)任務(wù)同時(shí)在不同的CPU核心上執(zhí)行。強(qiáng)調(diào)同一時(shí)刻多個(gè)任務(wù)之間的” 同時(shí)執(zhí)行 “。 并發(fā):同一個(gè)時(shí)間段內(nèi)多個(gè)任務(wù)都在進(jìn)展。強(qiáng)調(diào)多個(gè)任務(wù)間的” 交替執(zhí)行 “。 隨著硬件水平的提高,現(xiàn)在的終端主機(jī)都是多個(gè)CPU,每個(gè)CPU都是多核結(jié)構(gòu)。當(dāng)多個(gè)CPU同

    2024年02月07日
    瀏覽(21)
  • golang Goroutine超時(shí)控制

    ?https://github.com/zeromicro/go-zero/blob/master/core/fx/timeout.go ?一文搞懂 Go 超時(shí)控制_51CTO博客_go 超時(shí)處理

    2024年02月09日
    瀏覽(23)
  • golang協(xié)程goroutine教程

    項(xiàng)目經(jīng)常遇到一些批量任務(wù)執(zhí)行太慢,需要開(kāi)啟多線程去處理,記錄下在 Golang 中協(xié)程使用的一些操作。 協(xié)程是計(jì)算機(jī)程序的一類組件,推廣了協(xié)作式多任務(wù)的子例程,允許執(zhí)行被掛起與被恢復(fù)。相對(duì)子例程而言,協(xié)程更為一般和靈活,但在實(shí)踐中使用沒(méi)有子例程那樣廣泛。

    2024年02月02日
    瀏覽(35)
  • golang學(xué)習(xí)-goroutine

    1、goroutine協(xié)程 goroutine 是 Go 語(yǔ)言支持并發(fā)的核心,一個(gè)goroutine會(huì)以一個(gè)很小的棧開(kāi)始其生命周期,一般只需要2KB。區(qū)別于操作系統(tǒng)線程由系統(tǒng)內(nèi)核進(jìn)行調(diào)度, goroutine 是由Go運(yùn)行時(shí)(runtime)負(fù)責(zé)調(diào)度。例如Go運(yùn)行時(shí)會(huì)智能地將 m個(gè)goroutine 合理地分配給n個(gè)操作系統(tǒng)線程,實(shí)現(xiàn)類

    2024年01月18日
    瀏覽(32)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包