自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Go 語言中的并發(fā)特性

開發(fā) 后端
go 在并發(fā)方面為我們提供了一個(gè)語言級(jí)別的支持, goroutine 和 chan 相互配合,這決定了他的先天優(yōu)勢(shì)。

[[411568]]

本節(jié)源碼位置 https://github.com/golang-minibear2333/golang/blob/master/4.concurrent/4.1-goroutine/”

以前我們寫并發(fā)的程序一般是用多線程來實(shí)現(xiàn),自己維護(hù)一個(gè)線程池,在恰當(dāng)?shù)臅r(shí)候創(chuàng)建、銷毀、分配資源。

go 在并發(fā)方面為我們提供了一個(gè)語言級(jí)別的支持, goroutine 和 chan 相互配合,這決定了他的先天優(yōu)勢(shì)。

goroutine 的概念類似于線程, Go 程序運(yùn)行時(shí)會(huì)自動(dòng)調(diào)度和管理,系統(tǒng)能智能地將 goroutine 中的任務(wù)合理地分配給 CPU , 讓這些任務(wù)盡量并發(fā)運(yùn)作。

他和線程對(duì)比

從使用上講

  • 比線程更輕量級(jí),可以創(chuàng)建十萬、百萬不用擔(dān)心資源問題。
  • 和 chan 搭配使用,實(shí)現(xiàn)高并發(fā), goroutine 之間傳輸數(shù)據(jù)更方便。
  • 如果訪問同一個(gè)數(shù)據(jù)塊,要小心數(shù)據(jù)競(jìng)態(tài)問題、共享鎖還是互斥鎖的選擇問題、并發(fā)操作的數(shù)據(jù)同步問題(后面會(huì)說)

從其實(shí)現(xiàn)上講

  • 從資源上講,線程的棧內(nèi)存大小一般是固定的一般為 2MB ,雖然這個(gè)數(shù)值可以設(shè)置,但是 太大了浪費(fèi),太小了容易不夠用, 而 goroutine 棧內(nèi)存是可變的,初始一般為 2KB ,隨著需求可以擴(kuò)大達(dá)到 1GB。所以 goroutine 十分的輕量級(jí),且能滿足不同的需求。
  • 從調(diào)度上講,線程的調(diào)度由 OS 的內(nèi)核完成;線程的切換需要 CPU 寄存器 和 內(nèi)存的數(shù)據(jù)交換 ,從而切換不同的線程上下文。其觸發(fā)方式為 CPU時(shí)鐘 , 而 goroutine 的調(diào)度則比較輕量級(jí),由自身的調(diào)度器完成。
  • 協(xié)程同線程的關(guān)系,有些類似于 線程同進(jìn)程的關(guān)系。

創(chuàng)建與使用

創(chuàng)建一個(gè) goroutine ,只需要在函數(shù)前加一個(gè) go 關(guān)鍵字就成了。

  1. go 函數(shù)名(參數(shù)) 

看一個(gè) dome

  1. func quickFun(){ 
  2.  fmt.Println("maybe you can's see me!"
  3.  
  4. func main(){ 
  5.  go quickFun() // 創(chuàng)建了一個(gè) goroutine 
  6.  fmt.Println("hey"
  7.  time.Sleep(time.Second
  • goroutine 和 main 主線程同時(shí)運(yùn)行
  • main 運(yùn)行結(jié)束會(huì)暴力終止所有協(xié)程,所以上面的程序多等待了 1 秒
  • Go 程序從 main 包的 main() 函數(shù)開始,在程序啟動(dòng)時(shí), Go 程序就會(huì)為 main() 函數(shù)創(chuàng)建一個(gè)默認(rèn)的 goroutine 。

輸出

  1. hey 
  2. maybe you can's see me! 

對(duì),就是這么簡(jiǎn)單,如果你的函數(shù)只在這里使用,也可以用匿名函數(shù)來創(chuàng)建 goroutine 。

  1. func main(){ 
  2.  go func() { 
  3.   fmt.Println("hello "
  4.  }() 
  5.  time.Sleep(time.Second) //main運(yùn)行結(jié)束會(huì)暴力終止所有協(xié)程,所以這里先等待1秒 

PS: 和線程不同,goroutine沒有唯一的id,所以我們沒辦法專門q針對(duì)某個(gè)協(xié)程進(jìn)行操作。

goroutine

goroutine 是 Go 語言并行設(shè)計(jì)的核心。goroutine 是一種比線程更輕量的實(shí)現(xiàn),十幾個(gè) goroutine 可能在底層就是幾個(gè)線程。實(shí)際上是 Go 在 runtime、系統(tǒng)調(diào)用等多方面對(duì) goroutine 調(diào)度進(jìn)行了封裝和處理。

使用 goroutine 只需要簡(jiǎn)單的在需要執(zhí)行的函數(shù)前添加 go 關(guān)鍵字即可。當(dāng)執(zhí)行 goroutine 時(shí)候,Go 語言立即返回,接著執(zhí)行剩余的代碼,不會(huì)阻塞主線程。

下面我們通過一小段代碼來講解 go 的使用:

  1. //首先我們先實(shí)現(xiàn)一個(gè) Add()函數(shù) 
  2. func Add(a, b int) { 
  3. c := a + b 
  4. fmt.Println(c) 
  5.  
  6. go Add(1, 2) //使用go關(guān)鍵字讓函數(shù)并發(fā)執(zhí)行 

Go 的并發(fā)執(zhí)行就是這么簡(jiǎn)單,當(dāng)在一個(gè)函數(shù)前加上 go 關(guān)鍵字,該函數(shù)就會(huì)在一個(gè)新的 goroutine 中并發(fā)執(zhí)行,當(dāng)該函數(shù)執(zhí)行完畢時(shí),這個(gè)新的 goroutine 也就結(jié)束了。不過需要注意的是,如果該函數(shù)具有返回值,那么返回值會(huì)被丟棄。所以什么時(shí)候用 go 還需要酌情考慮。

接著我們通過一個(gè)案例來體驗(yàn)一下 Go 的并發(fā)到底是怎么樣的。新建源文件 goroutine2.go,輸入以下代碼:

  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func Add(a, b int) { 
  6.  c := a + b 
  7.  fmt.Println(c) 
  8.  
  9. func main() { 
  10.  for i := 0; i < 10; i++ { 
  11.   go Add(i, i) 
  12.  } 

執(zhí)行 goroutine.go 文件會(huì)發(fā)現(xiàn)屏幕上什么都沒有,但程序并不會(huì)報(bào)錯(cuò),這是什么原因呢?

原來當(dāng)主程序執(zhí)行到 for 循環(huán)時(shí)啟動(dòng)了 10 個(gè) goroutine,然后主程序就退出了,而啟動(dòng)的 10 個(gè) goroutine 還沒來得及執(zhí)行 Add() 函數(shù),所以程序不會(huì)有任何輸出。也就是說主 goroutine 并不會(huì)等待其他 goroutine 執(zhí)行結(jié)束。

Go 語言提供的信道(channel)就是專門解決并發(fā)通信問題的,下一節(jié)我們將詳細(xì)介紹。

小結(jié)

學(xué) go 語言必學(xué)并發(fā),通過本節(jié)我們知道了協(xié)程是非常容易創(chuàng)建的,而且他非常輕量只占用 4k,其他語言很容易就上MB

協(xié)程的使用還要配合數(shù)據(jù)傳輸,生產(chǎn)者消費(fèi)者模型,關(guān)于協(xié)程的調(diào)度,我們后續(xù)再說。

 

另外并發(fā) bug 的定位和解決是老大難的問題了,平時(shí)就要注意的良好的代碼風(fēng)格和編程習(xí)慣。

本文轉(zhuǎn)載自微信公眾號(hào)「機(jī)智的程序員小熊」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系機(jī)智的程序員小熊公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 機(jī)智的程序員小熊
相關(guān)推薦

2023-12-21 07:09:32

Go語言任務(wù)

2023-01-30 15:41:10

Channel控制并發(fā)

2014-04-09 09:32:24

Go并發(fā)

2017-06-27 08:54:59

2024-04-07 11:33:02

Go逃逸分析

2022-07-19 12:25:29

Go

2023-07-29 15:03:29

2023-11-30 08:09:02

Go語言

2021-06-08 07:45:44

Go語言優(yōu)化

2023-01-12 08:52:50

GoroutinesGo語言

2021-07-30 07:28:15

WorkerPoolGo語言

2013-05-28 09:43:38

GoGo語言并發(fā)模式

2021-07-13 06:44:04

Go語言數(shù)組

2023-11-21 15:46:13

Go內(nèi)存泄漏

2023-12-30 18:35:37

Go識(shí)別應(yīng)用程序

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式

2025-03-27 00:45:00

2024-05-10 08:36:40

Go語言對(duì)象

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)