好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

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

Golang的select多路復用及channel使用操作

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

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

這里就可以用到cahnnel 配合select 實現多路復用。

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

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開始進行倒數計時。

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

申明一個int類型的 channel變量canLunch 用來做倒計時結束可以發射的信號量。 只有當倒數結束,且canLunch有值后才能進行發射。

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

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

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

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

最后運行Lunch函數。

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

補充:golang 使用select完成超時

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

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

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

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

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

巨人網絡通訊聲明:本文標題《Golang的select多路復用及channel使用操作》,本文關鍵詞  Golang,的,select,多路,復用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang的select多路復用及channel使用操作》相關的同類信息!
  • 本頁收集關于Golang的select多路復用及channel使用操作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: JlZZJLZZJlZZ亚洲女人18| 男女电梯春活梅开二度| 91久久精品无嫩草影院| 村长和寡妇互添下面| 欧美在线一级视频| 欧美日韩一区二区三区麻豆| 午夜香吻mp3视频免费观看| 蜜臀AV人妻国产精品99精东| 国产片婬乱一级毛片| 国产精品大全国产精品| 亚洲AV秘?一区二区桃木| 韩国大胸女友在线观看完整版| 国产精品扒开腿做爽爽爽A片| 啊…别了小黄文| 免费高清韩国视频在线观看| 深夜福利在线视频| 凹凸熟女白浆精品视频2| 亚洲AV无码国产精品色在线看| 局长玩寡妇的大乳| 男同电影| 可以免费看啪啪的qq群| md豆传媒视频在线观看完整版| 国产不卡1卡2卡三卡2021| 中国学生内谢69XXXⅩ精品| 日日摸日日添夜夜爽97| 涩涩视频| 伊人色综合久久成人| 日产中产美产一区二区三区 | 含羞草文化传媒| 亚洲 欧美 激情 国产 动漫| 国产三级做爰在线播放五魁| 一级做a爱片特黄在线观看yy | 欧美老妇Ⅹ乄乂?多毛AV在线| 日本三级理论| 辽阳县| 欧美性猛交乱大交XXXXⅩOOO视频 欧美黑人猛男做爰XXXⅩ | 大尺度做爰真人视频| 看黄色一级| 不小心睡了年下| 久久精品视频5| 日本三级欧美三级人妇英文|