国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

GO語言網(wǎng)絡(luò)編程(并發(fā)編程)select

這篇具有很好參考價值的文章主要介紹了GO語言網(wǎng)絡(luò)編程(并發(fā)編程)select。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

GO語言網(wǎng)絡(luò)編程(并發(fā)編程)select

1、select

1.1.1 select多路復(fù)用

在某些場景下我們需要同時從多個通道接收數(shù)據(jù)。通道在接收數(shù)據(jù)時,如果沒有數(shù)據(jù)可以接收將會發(fā)生阻塞。你也許會寫出如下代碼使用遍歷的方式來實現(xiàn):

for{
    // 嘗試從ch1接收值
    data, ok := <-ch1
    // 嘗試從ch2接收值
    data, ok := <-ch2
    …
}

這種方式雖然可以實現(xiàn)從多個通道接收值的需求,但是運行性能會差很多。為了應(yīng)對這種場景,Go內(nèi)置了select關(guān)鍵字,可以同時響應(yīng)多個通道的操作。

select的使用類似于switch語句,它有一系列case分支和一個默認(rèn)的分支。每個case會對應(yīng)一個通道的通信(接收或發(fā)送)過程。select會一直等待,直到某個case的通信操作完成時,就會執(zhí)行case分支對應(yīng)的語句。具體格式如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-708878.html

select {
case <-chan1:
   // 如果chan1成功讀到數(shù)據(jù),則進行該case處理語句
case chan2 <- 1:
   // 如果成功向chan2寫入數(shù)據(jù),則進行該case處理語句
default:
   // 如果上面都沒有成功,則進入default處理流程
}
  • select可以同時監(jiān)聽一個或多個channel,直到其中一個channel ready
package main

import (
   "fmt"
   "time"
)

func test1(ch chan string) {
   time.Sleep(time.Second * 5)
   ch <- "test1"
}
func test2(ch chan string) {
   time.Sleep(time.Second * 2)
   ch <- "test2"
}

func main() {
   // 2個管道
   output1 := make(chan string)
   output2 := make(chan string)
   // 跑2個子協(xié)程,寫數(shù)據(jù)
   go test1(output1)
   go test2(output2)
   // 用select監(jiān)控
   select {
   case s1 := <-output1:
      fmt.Println("s1=", s1)
   case s2 := <-output2:
      fmt.Println("s2=", s2)
   }
}
  • 如果多個channel同時ready,則隨機選擇一個執(zhí)行
package main

import (
   "fmt"
)

func main() {
   // 創(chuàng)建2個管道
   int_chan := make(chan int, 1)
   string_chan := make(chan string, 1)
   go func() {
      //time.Sleep(2 * time.Second)
      int_chan <- 1
   }()
   go func() {
      string_chan <- "hello"
   }()
   select {
   case value := <-int_chan:
      fmt.Println("int:", value)
   case value := <-string_chan:
      fmt.Println("string:", value)
   }
   fmt.Println("main結(jié)束")
}
  • 可以用于判斷管道是否存滿
package main

import (
   "fmt"
   "time"
)

// 判斷管道有沒有存滿
func main() {
   // 創(chuàng)建管道
   output1 := make(chan string, 10)
   // 子協(xié)程寫數(shù)據(jù)
   go write(output1)
   // 取數(shù)據(jù)
   for s := range output1 {
      fmt.Println("res:", s)
      time.Sleep(time.Second)
   }
}

func write(ch chan string) {
   for {
      select {
      // 寫數(shù)據(jù)
      case ch <- "hello":
         fmt.Println("write hello")
      default:
         fmt.Println("channel full")
      }
      time.Sleep(time.Millisecond * 500)
   }
}

到了這里,關(guān)于GO語言網(wǎng)絡(luò)編程(并發(fā)編程)select的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Go語言網(wǎng)絡(luò)編程(socket編程)WebSocket編程

    WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議 WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù) 在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進行雙向數(shù)據(jù)傳輸 需要安裝第

    2024年02月09日
    瀏覽(93)
  • Go語言網(wǎng)絡(luò)編程(socket編程)http編程

    Web服務(wù)器的工作原理可以簡單地歸納為 客戶機通過TCP/IP協(xié)議建立到服務(wù)器的TCP連接 客戶端向服務(wù)器發(fā)送HTTP協(xié)議請求包,請求服務(wù)器里的資源文檔 服務(wù)器向客戶機發(fā)送HTTP協(xié)議應(yīng)答包,如果請求的資源包含有動態(tài)語言的內(nèi)容,那么服務(wù)器會調(diào)用動態(tài)語言的解釋引擎負責(zé)處理“

    2024年02月09日
    瀏覽(95)
  • Go語言網(wǎng)絡(luò)編程(socket編程)TCP

    TCP協(xié)議 TCP/IP(Transmission Control Protocol/Internet Protocol) 即傳輸控制協(xié)議/網(wǎng)間協(xié)議,是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的傳輸層(Transport layer)通信協(xié)議,因為是面向連接的協(xié)議,數(shù)據(jù)像水流一樣傳輸,會存在黏包問題。 TCP服務(wù)端 一個TCP服務(wù)端可以同時連接很

    2024年02月09日
    瀏覽(97)
  • Go語言網(wǎng)絡(luò)編程(socket編程)TCP粘包

    服務(wù)端代碼如下: 客戶端代碼如下: 將上面的代碼保存后,分別編譯。先啟動服務(wù)端再啟動客戶端,可以看到服務(wù)端輸出結(jié)果如下: 收到client發(fā)來的數(shù)據(jù): Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you?Hello, Hello. How are you? 收到client發(fā)來的數(shù)

    2024年02月09日
    瀏覽(96)
  • Go語言網(wǎng)絡(luò)編程介紹以及案例運用

    1. 基本概念 TCP 和 UDP : Go語言支持TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議)。TCP提供可靠的、面向連接的通信,而UDP提供無連接的快速數(shù)據(jù)傳輸。 并發(fā) : Go語言的并發(fā)模型是通過goroutines實現(xiàn)的。每個網(wǎng)絡(luò)請求都可以在自己的goroutine中處理,實現(xiàn)高效的并發(fā)。 Channels : 用于

    2024年01月25日
    瀏覽(105)
  • Go語言的網(wǎng)絡(luò)編程與HTTP服務(wù)

    Go語言(Golang)是Google開發(fā)的一種靜態(tài)類型、垃圾回收、并發(fā)簡單的編程語言。Go語言的設(shè)計目標(biāo)是讓程序員更容易編寫并發(fā)程序,并在多核處理器上充分發(fā)揮性能。Go語言的網(wǎng)絡(luò)編程和HTTP服務(wù)是其核心功能之一,可以輕松地構(gòu)建高性能、可擴展的網(wǎng)絡(luò)應(yīng)用程序。 在本文中,我們

    2024年02月19日
    瀏覽(100)
  • Go語言的網(wǎng)絡(luò)編程與TCP_IP

    Go語言是一種現(xiàn)代的編程語言,由Google的Robert Griesemer、Rob Pike和Ken Thompson在2009年開發(fā)。Go語言的設(shè)計目標(biāo)是簡單、高效、可擴展和易于使用。它具有弱類型、垃圾回收、并發(fā)性和原生支持的網(wǎng)絡(luò)編程。Go語言的網(wǎng)絡(luò)編程是其強大功能之一,它使得開發(fā)者可以輕松地編寫高性能的

    2024年02月22日
    瀏覽(115)
  • Go語言實戰(zhàn):網(wǎng)絡(luò)編程與TCP_UDP

    Go語言是一種現(xiàn)代的編程語言,由Google的Robert Griesemer、Rob Pike和Ken Thompson于2009年開發(fā)。Go語言的設(shè)計目標(biāo)是簡單、高效、可擴展和易于使用。它具有垃圾回收、類型安全、并發(fā)性能等優(yōu)點。Go語言的網(wǎng)絡(luò)編程庫 net 包提供了TCP/UDP的實現(xiàn),使得開發(fā)者可以輕松地編寫網(wǎng)絡(luò)應(yīng)用程序

    2024年02月21日
    瀏覽(96)
  • 多進程并發(fā)TCP服務(wù)器模型(含客戶端)(網(wǎng)絡(luò)編程 C語言實現(xiàn))

    摘要 :大家都知道不同pc間的通信需要用到套接字sockte來實現(xiàn),但是服務(wù)器一次只能收到一個客戶端發(fā)來的消息,所以為了能讓服務(wù)器可以接收多個客戶端的連接與消息的傳遞,我們就引入了多進程并發(fā)這樣一個概念。聽名字就可以知道--需要用到進程,當(dāng)然也有多線程并發(fā)

    2024年02月17日
    瀏覽(105)
  • Go語言網(wǎng)絡(luò)編程:HTTP服務(wù)端之底層原理與源碼分析——http.HandleFunc()、http.ListenAndServe()

    Go語言網(wǎng)絡(luò)編程:HTTP服務(wù)端之底層原理與源碼分析——http.HandleFunc()、http.ListenAndServe()

    在 Golang只需要幾行代碼便能啟動一個 http 服務(wù),在上述代碼中,完成了兩件事: 調(diào)用 http.HandleFunc 方法,注冊了對應(yīng)于請求路徑 /ping 的 handler 函數(shù) 調(diào)用 http.ListenAndServe,啟動了一個端口為 8999 的 http 服務(wù) 2.1 server 結(jié)構(gòu) Addr :表示服務(wù)器監(jiān)聽的地址。如\\\":8080\\\"表示服務(wù)器在本地

    2024年02月08日
    瀏覽(96)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包