日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Go语言goroutine+channel+select简介

發布時間:2025/3/21 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go语言goroutine+channel+select简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

goroutine

Go語言是原生支持語言級并發的,這個并發的最小邏輯單元就是goroutinegoroutine就是Go語言提供的一種用戶態線程,這種用戶態線程是跑在內核級線程之上的,goroutine在運行時的調度是由Go語言提供的調度器來進行的,創建一個goroutine使用關鍵字gogo創建的goroutine不會阻塞主線程:

go func_name()

Go程序中沒有語言級的關鍵字讓你去創建一個內核線程,你只能創建goroutine,內核線程只能由調度器根據實際情況去創建。

調度器原理參考鏈接:http://studygolang.com/articles/1855

?

channel:

Channel是Go中的一個核心類型,可以把它看成一個管道,通過它可以發送或者接收數據進行通訊(communication)。配合goroutine,就形成了一種既簡單又強大的請求處理模型,即N個工作goroutine將處理的中間結果或者最終結果放入一個channel,另外有M個工作goroutine從這個channel拿數據,再進行進一步加工,通過組合這種過程,可以勝任各種復雜的業務模型。

channel的基本操作:

var c chan int???//聲明一個int類型的channel注意,該語句僅聲明,不初始化channel

c := make(chan type_name)???//創建一個無緩沖的type_name型的channel無緩沖的channel當放入1個元素后,后續的輸入便會阻塞

c := make(chan type_name, 100)???//創建一個緩沖區大小為100type_name型的channel

c <- x???//x發送到channel c中,如果channel緩沖區滿,則阻塞當前goroutine

<- c???//channel c中接收一個值,如果緩沖區為空,則阻塞

x = <- c???//channel c中接收一個值并存到x中,如果緩沖區為空,則阻塞

x, ok = <- c???//channel c中接收一個值,如果channel關閉了,那么okfalse(在沒有defaultselect語句的前提下),在channel未關閉且為空的情況下,仍然阻塞

close(c)???//關閉channel c

for term := range c {}???//等待并取出channelc中的值,直到channel關閉,會阻塞

單向channel:

var ch1 chan<- float64????//只能向里面寫入float64的數據,不能讀取

var ch2 <-chan int????????//只能讀取int型數據

?

select:

select用于在多個channel上同時進行偵聽并收發消息,當任何一個case滿足條件時即執行,如果沒有可執行的case則會執行defaultcase,如果沒有指定defaultcase,則會阻塞程序,select的語法:

select {

???case communication clause?:

??????statement(s);?????

???case communication clause?:

??????statement(s);

???/*可以定義任意數量的 case */

???default : /*可選 */

??????statement(s);

}

說明:

  • 每個case都必須是一次通信
  • 所有channel表達式都會被求值
  • 所有被發送的表達式都會被求值
  • 如果任意某個通信可以進行,它就執行;其他被忽略。
  • 如果有多個case都可以運行,Select會隨機公平地選出一個執行。其他不會執行。
  • 否則: 1.如果有default子句,則執行該語句。

    如果沒有default字句,select將阻塞,直到某個通信可以運行;Go不會重新對channel或值進行求值。

    ?

    demo:

    package main

    ?

    import (

    "fmt"

    ???"time"

    )

    ?

    func enqueue(q chan int) {

    ???time.Sleep(time.Second * 3)

    ??? q <- 10

    ??? close(q)

    }

    ?

    func main() {

    ??? var c =make(chan int)

    ??? go enqueue(c)

    ??? for {

    ??????? select {

    ??????????? casex, ok := <- c:

    ???????????????if ok {

    ???????????????????fmt.Println(x)

    ???????????????} else {

    ???????????????????fmt.Println("closed")

    ???????????????????return

    ???????????????}

    ???????????default:

    ???????????????fmt.Println("waiting")

    ???????????????time.Sleep(time.Second)

    ??????? }

    ??? }

    }

    ?

    關于合理使用goroutine,推薦一篇文章:http://www.cnblogs.com/yjf512/archive/2012/06/30/2571247.html

    總結

    以上是生活随笔為你收集整理的Go语言goroutine+channel+select简介的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。