Go語言select并發編程實戰指南

一、select作用

Go 語言中的 select 語句是處理多通道(Channel)操作的核心控制結構,專為高效并發通信而設計。通過巧妙運用 select 語句,開發者能夠高效實現并發控制、超時處理和非阻塞通信等功能,使其成為 Go 語言并發編程的核心利器。?

二、select語法與特性

select語法格式如下:

func main() {ch1 := make(chan string)ch2 := make(chan string)select {case val := <-ch1:  // 通道接收fmt.Println(val)case ch2 <- "send":   // 通道發送fmt.Println("Sent")default:            // 非阻塞分支fmt.Println("非阻塞分支")}}

每個 case 必須是通道的發送或接收操作。執行時會隨機選擇一個就緒的 case;若沒有 case 就緒,則在沒有 default 的情況下會阻塞,否則執行 default 語句。

select特性如下:

1)隨機調度:當多個 case 同時就緒時,系統會隨機選擇一個執行,有效避免饑餓問題。

2)阻塞與非阻塞:如果沒有 default 分支,select 會阻塞等待;若存在 default 則立即執行該分支。

3)單一執行:每次 select 只會執行一個 case,即使有多個通道同時處于就緒狀態。

三、select應用場景

?1)多通道監聽

從多個通道并發接收數據,優先處理最先返回響應的通道?,代碼示例如下:

func main() {ch1 := make(chan string)ch2 := make(chan string)select {case val := <-ch1:fmt.Println(val)case val := <-ch2:fmt.Println(val)}}

2)超時控制

結合?time.After?實現操作超時,代碼示例如下:

func main() {ch1 := make(chan string)select {case res := <-ch1:fmt.Println(res)case <-time.After(2 * time.Second): //2秒未從ch1讀取到數據,則觸發此casefmt.Println("超時")}}

3)非阻塞操作?

使用 default 避免通道阻塞,代碼示例如下:

func main() {ch1 := make(chan string)select {case ch1 <- "send":fmt.Println("Sent")default:fmt.Println("Channel full")}}

4)優雅退出?

監聽退出信號通道,代碼示例如下:

func main() {quitCh := make(chan os.Signal, 1)workCh := make(chan string)select {case <-quitCh:fmt.Println("exit")returncase data := <-workCh:fmt.Println(data)}}

四、select使用注意事項

1)空 select:select{} 會導致永久阻塞,常用于主函數中保持程序持續運行。

2)通道狀態檢測:通過 val, ok := <-ch 語法可以判斷通道是否已關閉。

3)死鎖預防:在使用 select 語句時,必須確保至少有一個 case 分支或 default 分支能夠執。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93129.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93129.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93129.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV常見問題匯總

1、深度拷貝的問題我對整張圖像通過裁剪分別進行識別&#xff0c;出現識別結果與期望不同的問題&#xff0c;經過大量排查是OpenCV深度拷貝問題&#xff0c;我原來有問題的寫法cv::Mat matCrop matZoom(roi); cv::Mat matCrop1 matCrop(roi1); cv::Mat matCrop2 matCrop(roi2)…

【Unity開發】Unity核心學習(一)

一、2D相關1、圖片導入相關設置 &#xff08;1&#xff09;Unity支持的圖片格式 支持BMP、TIF、JPG、PNG、TGA、PSD 常用格式具體介紹&#xff1a; JPG&#xff1a;指JPGE格式&#xff0c;屬于有損壓縮格式&#xff0c;無透明通道 PNG&#xff1a;無損壓縮格式&#xff0c;有透…

Python自定義異常類的寫法與使用場景

在軟件開發的生命周期中&#xff0c;異常處理是保障程序健壯性與可維護性的關鍵環節。Python作為一門高級編程語言&#xff0c;內置了豐富的異常機制&#xff0c;能夠高效、優雅地應對運行時的各種錯誤。然而&#xff0c;面對復雜業務場景和多層架構時&#xff0c;內置異常往往…

為 Promethus 配置https訪問

一、序言 本篇將介紹如何使用數字證書為Promethus 訪問提供加密功能&#xff0c;由于是實驗環境證書由openssl生成&#xff0c;操作指南來自官網手冊&#xff1a;https://prometheus.io/docs/guides/tls-encryption/在生產環境中prometheus可能會放在后端&#xff0c;證書一般配…

擺脫例行 SQL 報表的隱性成本:用 n8n 構建四節點自動化報告流程

例行 SQL 報表的隱藏成本 各類組織的數據團隊都面臨同樣的反復難題:利益相關方需要定期報告,但手工 SQL 報表占用了本可用于分析的寶貴時間。無論公司規模如何,流程幾乎一致——連接數據庫、執行查詢、格式化結果,并將結論分發給決策者。 數據從業者經常要處理并不需要高…

HCIP——OSPF綜合實驗

一、實驗拓撲二、實驗要求1、R4為ISP&#xff0c;其上只配置IP地址&#xff1b;R4與其他所直連設備間均使用公有IP&#xff1b; 2、R3-R5、R6、R7為MGRE環境&#xff0c;R3為中心站點&#xff1b; 3、整個OSPF環境IP基于172.16.0.0/16劃分&#xff1b;除了R12有兩個環回&#x…

GitHub 趨勢日報 (2025年08月12日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1397gpt4all442system-prompts-and-models-of-ai-tools331umami307full-stack-fast…

Linux網絡性能調優終極指南:深度解析與實踐

Linux網絡性能調優終極指南&#xff1a;深度解析與實踐 一、性能調優核心原理體系 1.1 數據包生命周期與性能瓶頸 #mermaid-svg-TsvnmiGx1WeTerK2 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-TsvnmiGx1WeTerK2 .…

串口超時參數深度解析:ReadTotalTimeoutMultiplier、ReadIntervalTimeout等

一、參數定義與作用 1.1 ReadIntervalTimeout&#xff08;字符間隔超時&#xff09; 定義&#xff1a;指定兩個連續字符到達之間的最大允許時間&#xff08;毫秒&#xff09;作用&#xff1a;當接收兩個字符的時間間隔超過該值時&#xff0c;ReadFile操作立即返回已緩沖的數據特…

ubuntu20.04下C++實現點云的多邊形區域過濾(2種實現:1、pcl的CropHull濾波器;2、CUDA上實現射線法)

在點云目標檢測中&#xff0c;經常會有一系列的誤識別&#xff0c;為了減小誤識別的概率&#xff0c;可以通過區域過濾來刪除不需要的點云&#xff0c;如下圖所示 本例中點云的場景為路口交通場景&#xff0c;已經把雷達坐標系的xoy面轉換至點云中的地平面&#xff0c;具體原理…

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389)

Java 大視界 -- Java 大數據在智能家居場景聯動與用戶行為模式挖掘中的應用(389) 引言: 正文: 一、傳統智能家居的 “劇本困境”:按流程走,不管人需 1.1 設備與用戶的 “理解差” 1.1.1 場景聯動 “太機械” 1.1.2 行為識別 “太粗糙” 1.1.3 技術落地的 “體驗坑” 二、…

7 ABP Framework 支持的 UI 框架

ABP Framework 支持的 UI 框架 該頁面詳細介紹了 ABP Framework 支持的三種 UI 框架&#xff08;Angular、Blazor、MVC/Razor Pages&#xff09;&#xff0c;以及它們的架構、依賴、項目結構和共享基礎設施。 框架概述 ABP 提供三種獨立又可組合使用的 UI 框架&#xff0c;它們…

C++中的`if`語句多操作條件執行及順序保證技術指南

C中的if語句多操作條件執行及順序保證技術指南 1. 引言 在C編程中&#xff0c;if語句是控制程序流程的基本結構。隨著C17引入if語句的初始化部分&#xff0c;開發者獲得了在條件判斷前執行初始化操作的能力。然而&#xff0c;實際開發中常遇到更復雜的場景&#xff1a;?在條件…

基于SpringBoot+Uniapp的非遺文化宣傳小程序(AI問答、協同過濾算法、Echarts圖形化分析)

“ &#x1f388;系統亮點&#xff1a;AI問答、協同過濾算法、Echarts圖形化分析”01系統開發工具與環境搭建前后端分離架構項目架構&#xff1a;B/S架構運行環境&#xff1a;win10/win11、jdk17小程序端&#xff1a;技術&#xff1a;Uniapp&#xff1b;UI庫&#xff1a;colorU…

[TG開發]簡單的回聲機器人

你好! 如果你想了解如何在Java上編寫Telegram機器人&#xff0c;你來對地方了!準備啟動機器人API基于HTTP請求&#xff0c;但在本書中我將使用Rubenlagus的Java庫安裝庫你可以使用不同的方法安裝TelegramBots庫, 我這里使用Maven<dependency><groupId>org.telegram…

Ubuntu下快速安裝Tomcat教程

Apache Tomcat 是一個開源的軟件服務器,用于部署和運行 Java Servlet 和 JSP(JavaServer Pages)。本文將詳細介紹如何在 Ubuntu 系統上安裝并配置 Apache Tomcat。無論你是要開發企業級應用還是學習 Java Web 開發,Tomcat 都是一個不可或缺的工具。 Tomcat 基礎功能 Tomca…

并發編程(八股)

概述并行:同一個時間點,多個線程同時執行 并發:同一個時間段,多個線程交替執行,微觀上是一個一個的執行,宏觀上感覺是同時執行 核心問題: 多線程訪問共享數據存在資源競用問題 不可見性 java內存模型(jmm) 變量數據都存在于主內存里,每個線程還有自己的工作內存(本地內存),規定…

如何在 Spring Boot 中設計和返回樹形結構的組織和部門信息

如何在 Spring Boot 中設計和返回樹形結構的組織和部門信息 文章目錄如何在 Spring Boot 中設計和返回樹形結構的組織和部門信息1. 需求分析一、數據庫表設計1.1 organization 表設計1.2 department 表設計1.3 模擬數據二、后端設計2.1 實體類設計Organization 實體類Departmen…

Java畢業設計選題推薦 |基于SpringBoot的水產養殖管理系統 智能水產養殖監測系統 水產養殖小程序

&#x1f525;作者&#xff1a;it畢設實戰小研&#x1f525; &#x1f496;簡介&#xff1a;java、微信小程序、安卓&#xff1b;定制開發&#xff0c;遠程調試 代碼講解&#xff0c;文檔指導&#xff0c;ppt制作&#x1f496; 精彩專欄推薦訂閱&#xff1a;在下方專欄&#x1…

排序概念、插入排序及希爾排序

一、排序基本概念1.就地排序&#xff1a;使用恒定的額外空間來產生輸出就地排序只是在原數組空間進行排序處理&#xff0c;也就是輸入的數組和得到的數組是同一個2.內部排序和外部排序&#xff1a;待排序數據可以一次性載入到內存中為內部排序&#xff0c;反之數據量過大就是外…