欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang的select多路復(fù)用及channel使用操作

 更新時(shí)間:2020年12月21日 15:55:30   作者:piperck  
這篇文章主要介紹了Golang的select多路復(fù)用及channel使用操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

看到有個(gè)例子實(shí)現(xiàn)了一個(gè)類似于核彈發(fā)射裝置,在發(fā)射之前還是需要隨時(shí)能輸入終止發(fā)射。

這里就可以用到cahnnel 配合select 實(shí)現(xiàn)多路復(fù)用。

select的寫法用法有點(diǎn)像switch。但是和switch不同的是,select的一個(gè)case代表一個(gè)通信操作(在某個(gè)channel上進(jìn)行發(fā)送或者接收)并且會(huì)包含一些語句組成的一個(gè)語句塊。現(xiàn)在讓我們來實(shí)現(xiàn)一下這個(gè)核彈發(fā)射器

package main
import (
 "fmt"
 "time"
 "os"
)
func launch() {
 fmt.Println("nuclear launch detected")
}
func commencingCountDown(canLunch chan int) {
 c := time.Tick(1 * time.Second)
 for countDown := 20; countDown > 0; countDown-- {
  fmt.Println(countDown)
  <- c
 }
 canLunch <- -1
}
func isAbort(abort chan int) {
 os.Stdin.Read(make([]byte, 1))
 abort <- -1
}
func main() {
 fmt.Println("Commencing coutdown")
 abort := make(chan int)
 canLunch := make(chan int)
 go isAbort(abort)
 go commencingCountDown(canLunch)
 select {
 case <- canLunch:
 case <- abort:
  fmt.Println("Launch aborted!")
  return
 }
 launch()
}

首先打印了一個(gè)commencing countdown開始進(jìn)行倒數(shù)計(jì)時(shí)。

申明一個(gè)int類型的 channel變量abort 用來做取消時(shí)候傳遞給select的消息信號(hào)量這個(gè)后面會(huì)介紹到。

申明一個(gè)int類型的 channel變量canLunch 用來做倒計(jì)時(shí)結(jié)束可以發(fā)射的信號(hào)量。 只有當(dāng)?shù)箶?shù)結(jié)束,且canLunch有值后才能進(jìn)行發(fā)射。

用一個(gè)goroutine開啟一個(gè)用于監(jiān)聽是否有停止發(fā)射信號(hào)的函數(shù)isAbort并且把申明好的channel變量傳入。

isAbort就干一件事情,監(jiān)聽是否有標(biāo)準(zhǔn)輸入輸入,如果有輸入我們默認(rèn)是下達(dá)了發(fā)射停止的信號(hào) 需要向abort channel里面發(fā)送一個(gè)信號(hào)。這里我們會(huì)發(fā)射一個(gè)-1

用一個(gè)goroutine開啟一個(gè)用于倒數(shù)計(jì)時(shí)的函數(shù)commencingCountDown負(fù)責(zé)開始倒計(jì)時(shí),這里重新申明了一個(gè) TICK channel 每一秒倒數(shù)計(jì)時(shí)一下。并且在倒數(shù)計(jì)時(shí)完成之后向canLunch channel發(fā)送信號(hào)。

然后開始執(zhí)行select,select在沒有就緒的channel的時(shí)候會(huì)阻塞或者執(zhí)行指定的defualt,這里我沒有寫default所以他會(huì)阻塞監(jiān)聽兩個(gè)信號(hào),一個(gè)是canLunch,一個(gè)是停止發(fā)送。只要收到任何一個(gè)信號(hào)后,執(zhí)行該信號(hào)后面的內(nèi)容

最后運(yùn)行Lunch函數(shù)。

其實(shí)把思路理清楚,以并發(fā)的思考方式去思考這類問題感覺還是不會(huì)太亂。多加練習(xí)應(yīng)該會(huì)變好。下面的文章應(yīng)該會(huì)開始逐步開始從服務(wù)器和連接開始,實(shí)現(xiàn)一個(gè)im系統(tǒng)?;蛘咛砑痈嗟膶?shí)踐。

補(bǔ)充:golang 使用select完成超時(shí)

我就廢話不多說了,大家還是直接看代碼吧~

timeout := make(chan bool, 1)
go func() {
 time.Sleep(1e9)
 timeout <- true
} ()
 
select {
 case <- ch:
  //從ch中讀取數(shù)據(jù)
 case <-timeout:
  //ch一直沒有數(shù)據(jù)寫入,超時(shí)觸發(fā)timeout
}
func main() {
 var a chan string
 a =make(chan string)
 go sendDataTo(a)
 go timing()
 getAchan(10*time.Second,a) 
}
 
func sendDataTo(a chan string) {
 for {
   a <- "我是a通道的數(shù)據(jù)"
  time.Sleep(1e9 *3)
 }
}
 
//在一定時(shí)間內(nèi)接收不到a的數(shù)據(jù)則超時(shí)
func getAchan(timeout time.Duration, a chan string) {
 var after <-chan time.Time
 loop:
 after = time.After(timeout)
 for{
  fmt.Println("等待a中的數(shù)據(jù),10秒后沒有數(shù)據(jù)則超時(shí)")
  select {
  case x :=<- a:
   fmt.Println(x)
   goto loop
  case <-after:
   fmt.Println("timeout.")
   return
  }
 }
}
func timing() {
 //定時(shí)器,10秒鐘執(zhí)行一次
 ticker := time.NewTicker(10 * time.Second)
 for {
  time := <-ticker.C
  fmt.Println("定時(shí)器====>",time.String())
 }
} 

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • 一鍵定位Golang線上服務(wù)內(nèi)存泄露的秘籍

    一鍵定位Golang線上服務(wù)內(nèi)存泄露的秘籍

    內(nèi)存泄露?別讓它拖垮你的Golang線上服務(wù)!快速掌握Go語言服務(wù)內(nèi)存泄漏排查秘籍,從此問題無處遁形,一文讀懂如何精準(zhǔn)定位與有效解決Golang應(yīng)用中的內(nèi)存問題,立即閱讀,讓性能飛升!
    2024-01-01
  • 詳解Golang?ProtoBuf的基本語法總結(jié)

    詳解Golang?ProtoBuf的基本語法總結(jié)

    最近項(xiàng)目是采用微服務(wù)架構(gòu)開發(fā)的,各服務(wù)之間通過gPRC調(diào)用,基于ProtoBuf序列化協(xié)議進(jìn)行數(shù)據(jù)通信,因此接觸學(xué)習(xí)了Protobuf,本文會(huì)對Protobuf的語法做下總結(jié),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-10-10
  • golang import自定義包方式

    golang import自定義包方式

    這篇文章主要介紹了golang import自定義包方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang實(shí)現(xiàn)自定義recovery中間件

    Golang實(shí)現(xiàn)自定義recovery中間件

    在?Golang?的?Web?項(xiàng)目中,自定義?recovery?中間件是一種常見的做法,用于捕獲并處理應(yīng)用程序的運(yùn)行時(shí)錯(cuò)誤,下面我們就來看看具體如何實(shí)現(xiàn)吧
    2023-09-09
  • go 原生http web 服務(wù)跨域restful api的寫法介紹

    go 原生http web 服務(wù)跨域restful api的寫法介紹

    這篇文章主要介紹了go 原生http web 服務(wù)跨域restful api的寫法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • 深入理解Go語言中的數(shù)組和切片

    深入理解Go語言中的數(shù)組和切片

    Go語言中的數(shù)組大概相當(dāng)與C/C++中的數(shù)組,固定大小,不能夠動(dòng)態(tài)擴(kuò)展大小,而切片大概相當(dāng)與C++中的Vector,可以動(dòng)態(tài)擴(kuò)展大小,當(dāng)大小超過容量時(shí),重新分配一塊內(nèi)存,然后將數(shù)據(jù)復(fù)制到新的內(nèi)存區(qū)域。下面我們通過幾個(gè)問題來更好理解golang 的數(shù)組和切片,一起來看看吧。
    2016-09-09
  • Go語言for-range函數(shù)使用技巧實(shí)例探究

    Go語言for-range函數(shù)使用技巧實(shí)例探究

    這篇文章主要為大家介紹了Go語言for-range函數(shù)使用技巧實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 詳解go-zero如何使用validator進(jìn)行參數(shù)校驗(yàn)

    詳解go-zero如何使用validator進(jìn)行參數(shù)校驗(yàn)

    這篇文章主要介紹了如何使用validator庫做參數(shù)校驗(yàn)的一些十分實(shí)用的使用技巧,包括翻譯校驗(yàn)錯(cuò)誤提示信息、自定義提示信息的字段名稱、自定義校驗(yàn)方法等,感興趣的可以了解下
    2024-01-01
  • 詳解go?mod?使用方法

    詳解go?mod?使用方法

    golang 提供了 go mod命令來管理包,是go的一個(gè)模塊管理工具,用來代替?zhèn)鹘y(tǒng)的GOPATH方案,本文給大家介紹go?mod?使用方法,感興趣的朋友一起看看吧
    2022-05-05
  • go語言變量定義用法實(shí)例

    go語言變量定義用法實(shí)例

    這篇文章主要介紹了go語言變量定義用法,實(shí)例分析了go語言變量的定義及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02

最新評(píng)論