成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言中的并發特性

開發 后端
go 在并發方面為我們提供了一個語言級別的支持, goroutine 和 chan 相互配合,這決定了他的先天優勢。

[[411568]]

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

以前我們寫并發的程序一般是用多線程來實現,自己維護一個線程池,在恰當的時候創建、銷毀、分配資源。

go 在并發方面為我們提供了一個語言級別的支持, goroutine 和 chan 相互配合,這決定了他的先天優勢。

goroutine 的概念類似于線程, Go 程序運行時會自動調度和管理,系統能智能地將 goroutine 中的任務合理地分配給 CPU , 讓這些任務盡量并發運作。

他和線程對比

從使用上講

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

從其實現上講

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

創建與使用

創建一個 goroutine ,只需要在函數前加一個 go 關鍵字就成了。

  1. go 函數名(參數) 

看一個 dome

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

輸出

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

對,就是這么簡單,如果你的函數只在這里使用,也可以用匿名函數來創建 goroutine 。

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

PS: 和線程不同,goroutine沒有唯一的id,所以我們沒辦法專門q針對某個協程進行操作。

goroutine

goroutine 是 Go 語言并行設計的核心。goroutine 是一種比線程更輕量的實現,十幾個 goroutine 可能在底層就是幾個線程。實際上是 Go 在 runtime、系統調用等多方面對 goroutine 調度進行了封裝和處理。

使用 goroutine 只需要簡單的在需要執行的函數前添加 go 關鍵字即可。當執行 goroutine 時候,Go 語言立即返回,接著執行剩余的代碼,不會阻塞主線程。

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

  1. //首先我們先實現一個 Add()函數 
  2. func Add(a, b int) { 
  3. c := a + b 
  4. fmt.Println(c) 
  5.  
  6. go Add(1, 2) //使用go關鍵字讓函數并發執行 

Go 的并發執行就是這么簡單,當在一個函數前加上 go 關鍵字,該函數就會在一個新的 goroutine 中并發執行,當該函數執行完畢時,這個新的 goroutine 也就結束了。不過需要注意的是,如果該函數具有返回值,那么返回值會被丟棄。所以什么時候用 go 還需要酌情考慮。

接著我們通過一個案例來體驗一下 Go 的并發到底是怎么樣的。新建源文件 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.  } 

執行 goroutine.go 文件會發現屏幕上什么都沒有,但程序并不會報錯,這是什么原因呢?

原來當主程序執行到 for 循環時啟動了 10 個 goroutine,然后主程序就退出了,而啟動的 10 個 goroutine 還沒來得及執行 Add() 函數,所以程序不會有任何輸出。也就是說主 goroutine 并不會等待其他 goroutine 執行結束。

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

小結

學 go 語言必學并發,通過本節我們知道了協程是非常容易創建的,而且他非常輕量只占用 4k,其他語言很容易就上MB

協程的使用還要配合數據傳輸,生產者消費者模型,關于協程的調度,我們后續再說。

 

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

本文轉載自微信公眾號「機智的程序員小熊」,可以通過以下二維碼關注。轉載本文請聯系機智的程序員小熊公眾號。

 

責任編輯:武曉燕 來源: 機智的程序員小熊
相關推薦

2023-12-21 07:09:32

Go語言任務

2023-01-30 15:41:10

Channel控制并發

2014-04-09 09:32:24

Go并發

2017-06-27 08:54:59

2024-04-07 11:33:02

Go逃逸分析

2023-11-30 08:09:02

Go語言

2022-07-19 12:25:29

Go

2021-06-08 07:45:44

Go語言優化

2023-07-29 15:03:29

2023-01-12 08:52:50

GoroutinesGo語言

2021-07-30 07:28:15

WorkerPoolGo語言

2013-05-28 09:43:38

GoGo語言并發模式

2023-12-30 18:35:37

Go識別應用程序

2025-03-27 00:45:00

2024-01-08 07:02:48

數據設計模式

2021-07-13 06:44:04

Go語言數組

2023-11-21 15:46:13

Go內存泄漏

2012-06-15 09:56:40

2023-12-25 09:58:25

sync包Go編程

2024-05-10 08:36:40

Go語言對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷av一区二区三区软件 | 亚洲成人精品久久久 | 97精品一区二区 | 国户精品久久久久久久久久久不卡 | 日本免费黄色 | 久久成人精品一区二区三区 | 欧美激情在线观看一区二区三区 | 国产一区二区小视频 | 欧美激情综合 | 国产女人叫床高潮大片免费 | 亚洲一二三在线 | 亚洲 欧美 日韩 在线 | 国产精品美女www爽爽爽视频 | 久久成人18免费网站 | 国产亚洲一区二区三区 | 国产精品视频网 | 日韩欧美在 | 四虎在线观看 | 久久国内精品 | 欧美日韩亚洲一区 | 99久久中文字幕三级久久日本 | 91婷婷韩国欧美一区二区 | 一区二区三区在线 | 日韩精品一区二区三区视频播放 | 亚洲成人激情在线观看 | 欧美日韩淫片 | 第一色在线 | 黄色片在线观看网址 | 亚洲午夜电影 | 亚洲福利在线观看 | 性做久久久久久免费观看欧美 | 久久国产欧美日韩精品 | 夜操| 一区二区三区欧美 | 99亚洲精品视频 | 亚洲精品性视频 | 日韩小视频| 午夜精品视频一区 | 韩日免费视频 | 看片一区| 日韩在线视频免费观看 |