【Golang】️走進 Go 語言️ 第十六課 協程 & 通道

我是小白呀 2021-08-15 14:28:04 阅读数:374

本文一共[544]字,预计阅读时长:1分钟~
golang 十六 通道

【Golang】️走進 Go 語言️ 第十六課 協程 & 通道

概述

Golang 是一個跨平臺的新生編程語言. 今天小白就帶大家一起攜手走進 Golang 的世界. (第 16 課)

在這裏插入圖片描述

協程

協程 (Coroutine) 是一種基於線程之上, 但又比線程更加輕量級的存在. 一個進程可以擁有多個線程, 一個線程也可以擁有多個協程. 協程擁有高並發, 高 I/O, 低計算.

在這裏插入圖片描述

並發 vs 並行

並發:

  • 將 CPU 運行時間劃分成若幹個時間段, 一個時間段內只運行一個線程, 其他線程處於掛起狀態

並行:

  • 一個 CPU 在執行一個線程的時候, 另一個 CPU 在執行另一個線程, 兩個線程同時運行.

在這裏插入圖片描述

進程 vs 線程 vs 協程

進程:

  • 一個進程好比是一個程序, 是資源分配的最小單比特.

線程:

  • 一個線程好比是一個任務, 是程序執行過程中的最小單元

協程:

  • 輕量級的線程, 高並發, 高擴展性, 低成本

在這裏插入圖片描述

協程並發

package main
import (
"fmt"
"time"
)
func main() {
// 協程並發
go helloword("222")
go helloword("333")
// 函數調用
helloword("111")
}
func helloword(str string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(str)
}
}

輸出結果:

222
111
333
333
222
111
222
111
333
111
222
333
222
111

我們可以看到輸出沒有固定先後順序.

不適用並發:

在這裏插入圖片描述

通道

Go 語言中的通道 (Channel) 是一種特殊的類型. 在任何時候, 同時只能有一個 goroutine 訪問通道進行發送和獲取數據. 通道就像一個隊列, 遵循啊先入先出的原則, 保證收發數據的順序.

在這裏插入圖片描述

創建通道

格式:

通道實例 := make(chan 數據類型)
  • 數據類型: 通道內傳輸的元素類型
  • 通道實例: 通過 make 創建的通道句柄

例子:

package main
import "fmt"
func main() {
// 創建整數通道
var channel = make(chan string)
// 發送數據給通道
go func() {channel <- "message"}()
// 定義字符串變量
msg := <- channel
// 調試輸出
fmt.Print(msg)
}

輸出結果:

message

通道同步

例子:

package main
import "fmt"
func send_msg(send chan string, msg string) {
send <- msg
}
func receive_msg(send chan string, receive chan string) {
receive <- <-send
}
func main() {
// 創建通道
var send = make(chan string)
var receive = make(chan string)
// 協程
go send_msg(send, "message")
go receive_msg(send, receive)
// 調試輸出
fmt.Println(<-receive)
}

輸出結果:

message

在這裏插入圖片描述

版权声明:本文为[我是小白呀]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/08/20210815142745603a.html