主頁 > 知識庫 > Golang的select多路復(fù)用及channel使用操作

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

熱門標簽:江蘇呼叫中心外呼系統(tǒng)有效果嗎 官渡電銷外呼管理系統(tǒng)怎么收費 地圖區(qū)域圖標注后導(dǎo)出 赤峰電銷 400開頭電話怎樣申請 利用地圖標注位置 谷歌美發(fā)店地圖標注 貴州電話智能外呼系統(tǒng) 杭州人工智能電銷機器人費用

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

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

select的寫法用法有點像switch。但是和switch不同的是,select的一個case代表一個通信操作(在某個channel上進行發(fā)送或者接收)并且會包含一些語句組成的一個語句塊?,F(xiàn)在讓我們來實現(xiàn)一下這個核彈發(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()
}

首先打印了一個commencing countdown開始進行倒數(shù)計時。

申明一個int類型的 channel變量abort 用來做取消時候傳遞給select的消息信號量這個后面會介紹到。

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

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

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

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

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

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

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

補充:golang 使用select完成超時

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

timeout := make(chan bool, 1)
go func() {
 time.Sleep(1e9)
 timeout - true
} ()
 
select {
 case - ch:
  //從ch中讀取數(shù)據(jù)
 case -timeout:
  //ch一直沒有數(shù)據(jù)寫入,超時觸發(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)
 }
}
 
//在一定時間內(nèi)接收不到a的數(shù)據(jù)則超時
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ù)則超時")
  select {
  case x :=- a:
   fmt.Println(x)
   goto loop
  case -after:
   fmt.Println("timeout.")
   return
  }
 }
}
func timing() {
 //定時器,10秒鐘執(zhí)行一次
 ticker := time.NewTicker(10 * time.Second)
 for {
  time := -ticker.C
  fmt.Println("定時器====>",time.String())
 }
} 

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

您可能感興趣的文章:
  • Golang實現(xiàn)Directional Channel(定向通道)
  • 詳解Golang中Channel的用法
  • golang開發(fā)中channel使用
  • 基于golang channel實現(xiàn)的輕量級異步任務(wù)分發(fā)器示例代碼
  • golang中for循環(huán)遍歷channel時需要注意的問題詳解
  • golang 函數(shù)返回chan類型的操作

標簽:黔西 河池 鷹潭 松原 宜春 武漢 泰安 保定

巨人網(wǎng)絡(luò)通訊聲明:本文標題《Golang的select多路復(fù)用及channel使用操作》,本文關(guān)鍵詞  Golang,的,select,多路,復(fù)用,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang的select多路復(fù)用及channel使用操作》相關(guān)的同類信息!
  • 本頁收集關(guān)于Golang的select多路復(fù)用及channel使用操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章