C語言中文網 目錄
首頁 > Go語言教程 > Go語言并發 閱讀:2,675

Go語言通道的多路復用——同時處理接收和發送多個通道的數據

多路復用是通信和網絡中的一個專業術語。多路復用通常表示在一個信道上傳輸多路信號或數據流的過程和技術。

提示

報話機同一時刻只能有一邊進行收或者發的單邊通信,報話機需要遵守的通信流程如下:
  • 說話方在完成時需要補上一句“完畢”,隨后放開通話按鈕,從發送切換到接收狀態,收聽對方說話。
  • 收聽方在聽到對方說“完畢”時,按下通話按鈕,從接收切換到發送狀態,開始說話。

電話可以在說話的同時聽到對方說話,所以電話是一種多路復用的設備,一條通信線路上可以同時接收或者發送數據。同樣的,網線、光纖也都是基于多路復用模式來設計的,網線、光纖不僅可支持同時收發數據,還支持多個人同時收發數據。

在使用通道時,想同時接收多個通道的數據是一件困難的事情。通道在接收數據時,如果沒有數據可以接收將會發生阻塞。雖然可以使用如下模式進行遍歷,但運行性能會非常差。
for{
    // 嘗試接收ch1通道
    data, ok := <-ch1
    // 嘗試接收ch2通道
    data, ok := <-ch2
    // 接收后續通道
    …
}
Go 語言中提供了 select 關鍵字,可以同時響應多個通道的操作。select 的每個 case 都會對應一個通道的收發過程。當收發完成時,就會觸發 case 中響應的語句。多個操作在每次 select 中挑選一個進行響應。格式如下:

select{
    case 操作1:
        響應操作1
    case 操作2:
        響應操作2
    …
    default:
        沒有操作情況
}

  • 操作1、操作2:包含通道收發語句,請參考下表。

    select 多路復用中可以接收的樣式
    操   作 語句示例
    接收任意數據 case <- ch;
    接收變量 case d :=  <- ch;
    發送數據 case ch <- 100;
  • 響應操作1、響應操作2:當操作發生時,會執行對應 case 的響應操作。
  • default:當沒有任何操作時,默認執行 default 中的語句。

select 的詳細使用方法,請參考下節的示例。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo