Golang|Channel 相關用法理解

文章目錄

    • 用 channel 作為并發小容器
    • channel 的遍歷
    • channel 導致的死鎖問題
    • 用 channel 傳遞信號
    • 用 channel 并行處理文件
    • 用channel 限制接口的并發請求量
    • 用 channel 限制協程的總數量

用 channel 作為并發小容器

在這里插入圖片描述
在這里插入圖片描述

  • 注意這里的 ok 如果為 false,表示此時不僅channel為空,而且channel已經被關閉了

channel 的遍歷

在這里插入圖片描述

  • 注意,遍歷會使頭指針往后移,相當于取走元素
  • 如果 close channel 注釋掉,也不會報錯,但是會阻塞,導致輸出bye bye這一句代碼得不到執行
  • 遍歷的另外一種寫法

在這里插入圖片描述

channel 導致的死鎖問題

  • 上面的main方法是等3秒鐘結束main協程,更好的方法是使用waitGroup

在這里插入圖片描述
在這里插入圖片描述

  • 如果 close channel 注釋掉,程序執行的時候會報錯 fatal error: all goroutines are asleep - deadlock!
  • travese和main都阻塞了

用 channel 傳遞信號

  • 可以用向channel中傳遞信號,代替waitGroup,優雅地等子協程結束

在這里插入圖片描述

  • struct{} 空結構體類型,空結構體實例 struct{}{}
  • 空結構體在go語言里是一種特殊的結構體,go語言通過一個統一的引用變量來表示所有的空結構體,而且不占用任何的內存空間
  • 使用空結構體,語義會更加明確且不占內存

在這里插入圖片描述

  • 在 Go 語言(Golang)中,reflect 是一個非常強大的包,提供了 運行時反射機制,可以在運行時檢查變量的類型、獲取或設置變量的值。
// 獲取類型和值var x int = 42
t := reflect.TypeOf(x) // reflect.Type
v := reflect.ValueOf(x) // reflect.Valuefmt.Println("類型:", t)      // int
fmt.Println("值:", v.Int()) // 42
// 修改變量的值(需要傳指針)var x int = 10
v := reflect.ValueOf(&x)           // 注意要傳指針
v.Elem().SetInt(100)               // 修改值
fmt.Println("x的新值:", x)         // 100
// 檢查變量類型func checkType(i interface{}) {t := reflect.TypeOf(i)switch t.Kind() {case reflect.Int:fmt.Println("是整數")case reflect.String:fmt.Println("是字符串")default:fmt.Println("其他類型")}
}
// 結構體字段操作type Person struct {Name stringAge  int
}p := Person{"Tom", 30}
v := reflect.ValueOf(p)
t := reflect.TypeOf(p)for i := 0; i < t.NumField(); i++ {field := t.Field(i)value := v.Field(i)fmt.Printf("%s: %v\n", field.Name, value)
}

用 channel 并行處理文件

  • channel 不僅可以當作數據容器使用,也可以當作信號容器來使用
  • 下面這個例子是要把多個txt文件合并為一個txt文件,一個常規的思路就是我們順序讀取文件,每讀取一行就把這一行對應地寫入到新的文件里面去,但是io操作很消耗時間,且三個文件毫不相關,怎么加速?
  • 考慮三個goroutine并行讀,且往一個buffer channel寫數據,由一個goroutinue往buffer channel里讀數據寫入文件,這樣可以協調讀者和寫者的速度不匹配問題

在這里插入圖片描述

在這里插入圖片描述

  • 初始化pc_sync里面有3個元素,協程完成后會從pc_sync取走一個元素,當所有協程結束后,pc_sync為空

在這里插入圖片描述
在這里插入圖片描述

用channel 限制接口的并發請求量

  • 有時候我們需要限制微服務接口的并發請求度,因為有些接口會涉及到大量的cpu計算或者是內存開銷,如果瞬間并發度太大的話,服務器負載會很高
    在這里插入圖片描述
  • 但是如果限制了的話必然會犧牲用戶的體驗
  • 用channel的阻塞機制實現

在這里插入圖片描述

用 channel 限制協程的總數量

  • 需要封裝,對于所有的協程創建都去走一個統一的入口

在這里插入圖片描述

  • ticker 實際上就是每隔一段時間會給ticker.C中放入一個元素

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

Windows單機模擬MySQL主從復制

這里寫自定義目錄標題 下載MySQL ZIP壓縮包安裝主庫1、創建配置文件2、安裝服務3、初始化數據庫4、啟動服務5、配置主庫 安裝從庫1、配置ini文件2、安裝服務3、初始化數據庫4、啟動服務5、配置從庫6、驗證從庫狀態 操作主庫驗證 下載MySQL ZIP壓縮包 https://dev.mysql.com/do…

OSPF路由引入

一、基本概念與作用 1.OSPF路由引入指通過自治系統邊界路由器&#xff08;ASBR&#xff09;將外部路由&#xff08;如BGP、RIP、靜態路由或其他OSPF進程的路由&#xff09;注入當前OSPF域&#xff0c;實現跨協議或跨區域的網絡互通?。 其核心作用包括&#xff1a; ?擴展網…

弱口令爆破

1.簡單介紹 弱口令是指一些簡單易猜的密碼&#xff0c;可通過社工方式和一些爆破工具進行破解&#xff0c;以下介紹一款爆破工具的用法。burpsuite簡稱BP&#xff0c;一款可以利用字典破解賬戶密碼的工具。 2.部署網站 可以使用PHPstudy的Apache服務&#xff0c;也可以使用I…

Vue3+Vite前端項目部署后部分圖片資源無法獲取、動態路徑圖片資源報404錯誤的原因及解決方案

目錄 Vue3vite前端項目部署后部分圖片資源無法獲取、動態路徑圖片資源報404錯誤的原因及解決方案 一、情景介紹 1、問題出現的場景 2、無法加載的圖片寫法 二、反向代理原理簡介 三、造成該現象的原因 四、解決方案 1、放棄動態渲染 2、在頁面掛載的時候引入圖片資源 …

詳解如何從零用 Python復現類似 GPT-4o 的多模態模型

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

榕壹云無人共享系統:基于SpringBoot+MySQL+UniApp的物聯網共享解決方案

無人共享經濟下的技術革新 隨著無人值守經濟模式的快速發展&#xff0c;傳統共享設備面臨管理成本高、效率低下等問題。榕壹云無人共享系統依托SpringBootMySQLUniApp技術棧&#xff0c;結合物聯網與移動互聯網技術&#xff0c;為商家提供低成本、高可用的無人化運營解決方案。…

基于PHP的酒店網上訂房系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 酒店服務是旅游行業的一個重要組成部分&#xff0c;它的作用已經從過去的單一的住宿、結算帳務向全面、高水平的服務型酒店轉變。酒店的服務工作貫穿于整個酒店的市場營銷、預定、入住、退房、結賬等環節&#xff0c;酒店要提高整體工作水平&#xff0c;簡化工作程序&…

【Linux生成SSH秘鑰實現遠程連接】Linux生成SSH秘鑰對與修改服務配置文件實現無密碼遠程連接

文章目錄 前言1. Linux 生成SSH秘鑰對2. 修改SSH服務配置文件3. 客戶端秘鑰文件設置4. 本地SSH私鑰連接測試5. Linux安裝Cpolar工具6. 配置SSHTCP公網地址7. 遠程SSH私鑰連接測試8. 固定SSH公網地址9. 固定SSH地址測試 前言 在數字化江湖中&#xff0c;企業對各種技術的需求就…

# linux 設置寬容模式

linux 設置寬容模式 在Linux系統中&#xff0c;通常沒有直接稱為“寬容模式”的設置選項&#xff0c;但你可以通過幾種方式來模擬或調整系統行為&#xff0c;使其表現得更加“寬容”&#xff0c;特別是在處理錯誤、權限問題或其他潛在問題時。以下是一些常見的方法&#xff1a…

【C++】——lambda表達式

&#x1f31f; 前言:??C Lambda表達式,當函數開始"叛逆期"?? 你是否有過這樣的崩潰瞬間&#xff1f; 為了寫個??只用到一次??的排序規則&#xff0c;被迫定義了一個類在std::for_each里塞函數指針&#xff0c;代碼瞬間變成"古董級"寫法看著層的循環…

深入解析B站androidApp接口:從bilibili.api.ticket.v1.Ticket/GetTicket到SendMsg的技術分析

前言 最近一段時間&#xff0c;我對B站的App接口進行了深入分析&#xff0c;特別是關注了認證機制和私信功能的實現。通過逆向工程和網絡抓包&#xff0c;發現了B站移動端API的底層工作原理&#xff0c;包括設備標識生成機制、認證流程和消息傳輸協議。本文將分享這些研究成果…

從零開始學A2A一:A2A 協議概述與核心概念

A2A 協議概述與核心概念 學習目標 基礎理解 掌握A2A協議的基本概念和背景理解協議的設計原則和核心思想了解協議在AI領域的重要性 技術掌握 熟悉A2A協議的核心功能組件掌握能力發現和任務管理機制理解多模態交互和安全通信原則 實踐應用 能夠設計基于A2A的智能體系統掌握協議…

2025.04.10-拼多多春招筆試第三題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 03. 數字重排最大化問題 問題描述 LYA是一位專業的數字設計師。她手中有兩個數字序列 s 1 s_1

蒼穹外賣day04

Spring Task實現定時處理訂單狀態 作用&#xff1a;不需要輸入提示信號&#xff0c;便可定時自動執行程序 使用步驟 1、啟動類上加上注解&#xff08;EnableScheduling&#xff09;開啟定時任務調度 2、專門創建一個包來管理執行定時任務的類&#xff0c;該類需要交給IOC容…

BFD:網絡鏈路檢測與聯動配置全攻略

目錄 BFD簡介 BFD會話建立方式和檢測機制 BFD會話建立過程 BFD工作流程 聯動功能 BFD與OSPF聯動配置需求 BFD與OSPF聯動配置實現 BFD與VRRP聯動配置需求 BFD與VRRP聯動配置實現 單臂回聲 BFD默認參數及調整方法 BFD簡介 一種全網統一、檢測迅速、監控網絡中鏈…

【LLM】A2A 與 MCP:剖析 AI Agent 互聯時代的兩種關鍵協議

隨著人工智能技術的飛速發展&#xff0c;AI Agent&#xff08;智能體&#xff09;正從理論走向實踐&#xff0c;有望成為提升生產力的關鍵。然而&#xff0c;正如歷史上任何新興技術領域一樣&#xff0c;標準的缺失導致了“筒倉效應”——不同來源、不同框架構建的 Agent 難以有…

免費下載 | 2025清華五道口:“十五五”金融規劃研究白皮書

《2025清華五道口&#xff1a;“十五五”金融規劃研究白皮書》的核心內容主要包括以下幾個方面&#xff1a; 一、五年金融規劃的重要功能與作用 凝聚共識&#xff1a;五年金融規劃是國家金融發展的前瞻性謀劃和戰略性安排&#xff0c;通過廣泛聽取社會各界意見&#xff0c;凝…

滾輪控制目標臂長度調整相機距離

通過鼠標滾輪來控制攝像機目標臂長度 , 調整相機距離 看圖就行,不多說,照著連就完事了

kernel32!GetQueuedCompletionStatus函數分析之返回值得有效性

第一部分&#xff1a;//#define STATUS_SUCCESS 0x0返回值為0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…

UE5 Chaos :渲染網格體 (Render Mesh) 和模擬網格體 是如何關聯的?為什么模擬網格體 可以驅動渲染網格體?

官方文獻&#xff1a;https://dev.epicgames.com/community/learning/tutorials/pv7x/unreal-engine-panel-cloth-editor 這背后的核心是一種常見的計算機圖形學技術&#xff0c;通常稱為代理綁定 (Proxy Binding) 或 表面變形傳遞 (Surface Deformation Transfer)。 關聯機制…