首頁 常見問題 Go語言裡Channel相關解釋

Go語言裡Channel相關解釋

Apr 09, 2019 am 11:41 AM
channel go語言

Go語言中使用了CSP模型來進行線程通信,準確地說,是輕量級線程goroutine之間的通信。 CSP模型和Actor模型類似,也是由獨立的,並發執行的實體所構成,實體之間也是透過發送訊息進行通訊的。

一.Actor模型與CSP模型區別:

Actor之間直接通訊,而CSP是透過Channel通訊,在耦合度上兩者是有差別的,後者更加鬆散耦合。
主要的差異在於:CSP模型中訊息的發送者和接收者之間透過Channel鬆耦合,發送者不知道自己訊息被哪個接收者消費了,接收者也不知道是哪個發送者發送的訊息。在Actor模型中,由於Actor可以根據自己的狀態選擇處理哪個傳入訊息,因此自主性可控性會比較好。
在Go語言中為了不阻塞進程,程式設計師必須檢查不同的傳入訊息,以便預見確保正確的順序。 CSP好處是Channel不需要緩衝訊息,而Actor理論上需要一個無限大小的郵箱作為訊息緩衝。
CSP模型的訊息發送方只能在接收方準備好接收訊息時才能發送訊息。相反,Actor模型中的消息傳遞是異步 的,即訊息的發送和接收無需在同一時間進行,發送方可以在接收方準備好接收訊息前將訊息發送出去。

二.Go Channel詳解
Channel類型的定義格式如下:

ChannelType = ( "chan" | "chan" "<-" | "<-" "chan" ) ElementType .
登入後複製

它包含三種類型的定義。可選的<-代表channel的方向。如果沒有指定方向,那麼Channel就是雙向的,既可以接收數據,也可以發送數據。

chan T          // 可以接收和发送类型为 T 的数据
chan<- float64  // 只可以用来发送 float64 类型的数据
<-chan int      // 只可以用来接收 int 类型的数据
登入後複製

<-總是優先和最左邊的類型結合。 (The <- operator associates with the leftmost chan possible)

c := make(chan bool) //创建一个无缓冲的bool型Channel
c <- x        //向一个Channel发送一个值
<- c          //从一个Channel中接收一个值
x = <- c      //从Channel c接收一个值并将其存储到x中
x, ok = <- c  //从Channel接收一个值,如果channel关闭了或没有数据,那么ok将被置为false
登入後複製

預設情況下,channel發送方和接收方會一直阻塞直到對方準備好發送或者接收,這就使得Go語言無需加鎖或者其他條件,天然支持了並發。
使用make初始化Channel,並且可以設定容量:

make(chan int, 100) #//创建一个有缓冲的int型Channel
登入後複製

容量(capacity)代表Channel容納的最多的元素的數量,代表Channel的快取的大小。
如果沒有設定容量,或容量設定為0, 說明Channel沒有快取。
你可以在多個goroutine從/往 一個channel 中 receive/send 資料, 不必考慮額外的同步措施。
Channel可以作為一個先入先出(FIFO)的佇列,接收的資料和所傳送的資料的順序是一致的。
不含緩衝的Channel兼具通訊和同步兩種特性,在並發開發中頗受青睞。

// _Channels_ are the pipes that connect concurrent
// goroutines. You can send values into channels from one
// goroutine and receive those values into another
// goroutine.

package main

import "fmt"

func main() {

    // Create a new channel with `make(chan val-type)`.
    // Channels are typed by the values they convey.
    messages := make(chan string)

    // _Send_ a value into a channel using the `channel <-`
    // syntax. Here we send `"ping"`  to the `messages`
    // channel we made above, from a new goroutine.
    go func() { messages <- "ping" }()

    // The `<-channel` syntax _receives_ a value from the
    // channel. Here we&#39;ll receive the `"ping"` message
    // we sent above and print it out.
    msg := <-messages
    fmt.Println(msg)
}
登入後複製

這裡我們創建了一個沒有緩衝的string類型Channel,然後在一個goroutine把「ping」用channel<-傳給了這個Channel。 <-channel收到了這個值,然後在main函數列印出來。其實這裡我們利用Channel悄悄把「ping」message從一個goroutine轉移到了main goroutine,實現了線程間(準確的說,goroutine之間的)通訊。
因為channel發送方和接收方會一直阻塞直到對方準備好發送或接收,這就使得我們在程式末尾等」ping」 message而無需其他的同步操作。
再看一個範例:使用者自訂的goroutine完成某個操作之後提醒main goroutine:

// We can use channels to synchronize execution// across goroutines. Here&#39;s an example of using a// blocking receive to wait for a goroutine to finish.package mainimport "fmt"import "time"// This is the function we&#39;ll run in a goroutine. The// `done` channel will be used to notify another// goroutine that this function&#39;s work is done.func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")    // Send a value to notify that we&#39;re done.
    done <- true}func main() {    // Start a worker goroutine, giving it the channel to
    // notify on.
    done := make(chan bool, 1)    go worker(done)    // Block until we receive a notification from the
    // worker on the channel.
    <-done
}
登入後複製

           

################################################################################################ ###Go語言中使用了CSP模型來進行線程通信,準確地說,是輕量級線程goroutine之間的通信。 CSP模型和Actor模型類似,也是由獨立的,並發執行的實體所構成,實體之間也是透過發送訊息進行通訊的。 ######【推薦課程:###Go影片教學###】#######

以上是Go語言裡Channel相關解釋的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言中用於浮點數運算的庫有哪些? Go語言中用於浮點數運算的庫有哪些? Apr 02, 2025 pm 02:06 PM

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go的爬蟲Colly中Queue線程的問題是什麼? Go的爬蟲Colly中Queue線程的問題是什麼? Apr 02, 2025 pm 02:09 PM

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? 在 Go 語言中,為什麼使用 Println 和 string() 函數打印字符串會出現不同的效果? Apr 02, 2025 pm 02:03 PM

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

GoLand中自定義結構體標籤不顯示怎麼辦? GoLand中自定義結構體標籤不顯示怎麼辦? Apr 02, 2025 pm 05:09 PM

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? 在Go語言中使用Redis Stream實現消息隊列時,如何解決user_id類型轉換問題? Apr 02, 2025 pm 04:54 PM

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...

Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Go語言中哪些庫是由大公司開發或知名的開源項目提供的? Apr 02, 2025 pm 04:12 PM

Go語言中哪些庫是大公司開發或知名開源項目?在使用Go語言進行編程時,開發者常常會遇到一些常見的需求,�...

Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Go語言中`var`和`type`關鍵字定義結構體的區別是什麼? Apr 02, 2025 pm 12:57 PM

Go語言中結構體定義的兩種方式:var與type關鍵字的差異Go語言在定義結構體時,經常會看到兩種不同的寫法:一�...

使用 sql.Open 時,DSN 傳空為什麼不報錯? 使用 sql.Open 時,DSN 傳空為什麼不報錯? Apr 02, 2025 pm 12:54 PM

使用sql.Open時,DSN傳空為什麼不報錯?在Go語言中,sql.Open...