日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go语言goroutine+channel+select简介

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

goroutine

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

go func_name()

Go程序中沒有語言級的關(guān)鍵字讓你去創(chuàng)建一個內(nèi)核線程,你只能創(chuàng)建goroutine,內(nèi)核線程只能由調(diào)度器根據(jù)實際情況去創(chuàng)建。

調(diào)度器原理參考鏈接:http://studygolang.com/articles/1855

?

channel:

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

channel的基本操作:

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

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

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

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

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

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

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

close(c)???//關(guān)閉channel c

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

單向channel:

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

var ch2 <-chan int????????//只能讀取int型數(shù)據(jù)

?

select:

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

select {

???case communication clause?:

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

???case communication clause?:

??????statement(s);

???/*可以定義任意數(shù)量的 case */

???default : /*可選 */

??????statement(s);

}

說明:

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

    如果沒有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)

    ??????? }

    ??? }

    }

    ?

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

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。