golang學習筆記——將 channel 用作通信機制

文章目錄

  • 將 channel 用作通信機制
  • Channel 語法
  • 無緩沖 channel
  • 緩沖 channels
    • channel 與 goroutine
    • 緩沖 channels 示例
    • 多路復用

將 channel 用作通信機制

golang學習筆記——將 channel 用作通信機制
golang學習筆記——并發計算斐波納契數

Go 中的 channel 是 goroutine 之間的通信機制。 請記住 Go 的并發方法是:不是通過共享內存通信;而是通過通信共享內存。當你需要將值從一個 goroutine 發送到另一個時,可以使用通道。 讓我們看看它們的工作原理,以及如何開始使用它們來編寫并發 Go 程序。

Channel 語法

ch <- x // sends (or writes ) x through channel ch
x = <-ch // x receives (or reads) data sent to the channel ch
<-ch // receives data, but the result is discarded

關閉 channel

close(ch)

無緩沖 channel

使用 make() 函數創建 channel 時,會創建一個無緩沖 channel,這是默認行為。 無緩沖 channel 會阻止發送操作,直到有人準備好接收數據。

package mainimport ("fmt""net/http""time"
)func main() {start := time.Now()apis := []string{"https://mp.csdn.net/","https://dev.azure.com","https://api.somewhereintheinternet.com/","https://gitcode.net/",}ch := make(chan string)for _, api := range apis {go checkAPI(api, ch)}for i := 0; i < len(apis); i++ {fmt.Print(<-ch)}elapsed := time.Since(start)fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}func checkAPI(api string, ch chan string) {_, err := http.Get(api)if err != nil {ch <- fmt.Sprintf("ERROR: %s is down!\n", api)return}ch <- fmt.Sprintf("SUCCESS: %s is up and running!\n", api)
}

緩沖 channels

下面是一個理解有緩沖 channel 的簡單示例

package mainimport ("fmt"
)func send(ch chan string, message string) {ch <- message
}func main() {size := 4ch := make(chan string, size)send(ch, "one")send(ch, "two")send(ch, "three")send(ch, "four")fmt.Println("All data sent to the channel ...")for i := 0; i < size; i++ {fmt.Println(<-ch)}fmt.Println("Done!")
}

輸出

All data sent to the channel ...
one
two
three
four
Done!

試著將size改為2
重新運行程序時,將看到以下錯誤:

fatal error: all goroutines are asleep - deadlock!goroutine 1 [chan send]:
main.send(...)D:/golang2023/main.go:8
main.main()D:/golang2023/main.go:16 +0x97
exit status 2

channel 與 goroutine

channel 與 goroutine 有著緊密的聯系。 如果沒有另一個 goroutine 從 channel 接收數據,則整個程序可能會永久處于被阻止狀態。 正如你所見,這種情況確實會發生。

緩沖 channels 示例

使用之前用于檢查 API 的示例,并創建大小為 10 的緩沖通道

package mainimport ("fmt""net/http""time"
)func main() {start := time.Now()apis := []string{"https://management.azure.com","https://dev.azure.com","https://mp.csdn.net/","https://outlook.office.com/","https://api.somewhereintheinternet.com/","https://gitcode.net/",}ch := make(chan string, 10)for _, api := range apis {go checkAPI(api, ch)}for i := 0; i < len(apis); i++ {fmt.Print(<-ch)}elapsed := time.Since(start)fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}func checkAPI(api string, ch chan string) {_, err := http.Get(api)if err != nil {ch <- fmt.Sprintf("ERROR: %s is down!\n", api)return}ch <- fmt.Sprintf("SUCCESS: %s is up and running!\n", api)
}

多路復用

最后,讓我們討論如何使用 select 關鍵字與多個通道同時交互。 有時,在使用多個 channel 時,需要等待事件發生。 例如,當程序正在處理的數據中出現異常時,可以包含一些邏輯來取消操作。

select 語句的工作方式類似于 switch 語句,但它適用于 channel。 它會阻止程序的執行,直到它收到要處理的事件。 如果它收到多個事件,則會隨機選擇一個。

select 語句的一個重要方面是,它在處理事件后完成執行。 如果要等待更多事件發生,則可能需要使用循環。

讓我們使用以下程序來看看 select 的運行情況:

package mainimport ("fmt""time"
)func process(ch chan string) {time.Sleep(3 * time.Second)ch <- "Done processing!"
}func replicate(ch chan string) {time.Sleep(1 * time.Second)ch <- "Done replicating!"
}func main() {ch1 := make(chan string)ch2 := make(chan string)go process(ch1)go replicate(ch2)for i := 0; i < 2; i++ {select {case process := <-ch1 :fmt.Println(process)case replicate := <-ch2 :fmt.Println(replicate)}}
}

輸出

Done replicating!
Done processing!

請注意,replicate 函數首先完成,這就是首先在終端中看到其輸出的原因。 main 函數存在一個循環,因為 select 語句在收到事件后立即結束,但我們仍在等待 process 函數完成。

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

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

相關文章

使用Pytorch從零開始構建DCGAN

在本文中&#xff0c;我們將深入研究生成建模的世界&#xff0c;并使用流行的 PyTorch 框架探索 DCGAN&#xff08;生成對抗網絡 (GAN) 的一種變體&#xff09;的實現。具體來說&#xff0c;我們將使用 CelebA 數據集&#xff08;名人面部圖像的集合&#xff09;來生成逼真的合…

網絡安全等級保護收費標準?

不同省份價格會略有不同&#xff0c;二級等保一般不低于5萬元;三級等保不低于9萬元&#xff0c;個別省份也可能7萬也能辦理&#xff0c;根據企業實際情況和省市選定的代理機構確定。 等級保護二級? 第二級等保是指信息系統受到破壞后&#xff0c;會對公民、法人和其他組織的合…

刷到一個很騷氣的 Go 錯誤處理新提案

在比較一段長的時間里&#xff0c;Go 的錯誤處理已經沒有什么特別的進展和新改進了。看著已經到了瓶頸期。 今天在 GitHub 上學習時&#xff0c;看到 Go 社區里有人提了個錯誤處理的優化提案《proposal: Go 2: Error-Handling Paradigm with !err Grammar Sugar》&#xff0c;…

《YOLOv8創新改進》專欄指導書冊 手把手創新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8改進專欄&#xff1a;http://t.csdnimg.cn/hGhVK 學姐帶你學習YOLOv8&#xff0c;從入門到創新&#xff0c;輕輕松松搞定科研&#xff1b; 本專欄為訂閱者提供答疑服務&#xff0c;每一篇提供源代碼和詳細的每一個步驟改進地方。…

Navicat 技術指引 | 適用于 GaussDB 的模型功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持對 GaussDB 主備版的管理和開發功能。它不僅具備輕松、便捷的可視化數據查看和編輯功能&#xff0c;還提供強大的高階功能&#xff08;如模型、結構同步、協同合作、數據遷移等&#xff09;&#xff0c;這…

工業交換機具備哪些功能?

在工業網絡中&#xff0c;工業交換機起著至關重要的作用&#xff0c;具備多樣功能和廣泛的應用。 1、工業交換機的作用是實現不同網絡設備之間的互聯。它能夠連接各種不同類型的設備&#xff0c;如計算機、服務器、傳感器和監控設備&#xff0c;實現設備間的相互通信和數據傳輸…

應用高斯高通濾波器提取圖像輪廓

任務要求&#xff1a; 圖為HALCON中的例圖“tooth_rim”&#xff0c;請用高斯高通濾波器提取圖像的輪廓。 任務分析&#xff1a; 圖像的邊緣對應頻譜的高頻部分&#xff0c;可以通過構造一個高頻濾波器&#xff0c;過濾掉圖像的低頻部分&#xff0c;從而得到圖像的邊緣。HALC…

蘋果怎么關閉懸浮球?讓我來解答您的疑惑!

懸浮球是蘋果設備上的一種可進行自定義的快捷操作功能&#xff0c;它可以位于手機屏幕的任意位置&#xff0c;以浮動的方式顯示。然而&#xff0c;有時候懸浮球對某些朋友來說可能會變得多余&#xff0c;那么蘋果怎么關閉懸浮球呢&#xff1f;接下來&#xff0c;小編將為大家揭…

docker compose搭建滲透測試vulstudy靶場示例

前言 滲透測試&#xff08;Penetration test&#xff09;即網絡安全工程師/安全測試工程師/滲透測試工程師通過模擬黑客&#xff0c;在合法授權范圍內&#xff0c;通過信息搜集、漏洞挖掘、權限提升等行為&#xff0c;對目標對象進行安全測試&#xff08;或攻擊&#xff09;&am…

【快應用】小程序轉快應用中如何獲取用戶已授權的權限

【關鍵詞】 權限、SystemInfo、setting 【問題背景】 小程序轉快應用&#xff0c;用戶在使用快應用的過程中如果產生了一些授權行為&#xff0c;開發者是否有辦法去收集到用戶已經授權過的權限呢&#xff0c;從而進行更好管理呢&#xff1f; 【解決方案】 小程序轉快應用中是…

詳解——菱形繼承及菱形虛擬繼承

目錄 一&#xff0c;菱形繼承 1.1單繼承 1.2多繼承 1.3菱形繼承 1.4菱形繼承的問題 1.5虛擬繼承解決數據冗余和二義性的原理 二.繼承的總結和反思 一&#xff0c;菱形繼承 C三大特性——繼承-CSDN博客 1.1單繼承 單繼承&#xff1a;一個子類只有一個直接父類時稱這個繼…

javaScript解決手機瀏覽器下載為圖片之后,圖片漆黑無法保存的問題

pc端能正常下載圖片并查看 手機移動端下載的圖片全是黑色的并且無法保存&#xff0c;這個問題可能與移動瀏覽器的安全策略有關 解決辦法&#xff1a;使用Blob對象和createObjectURL方法來創建一個臨時URL&#xff0c;然后將其賦給鏈接的href屬性下載&#xff1a; // 轉blob函…

anaconda安裝配置

創建分區 conda create -n cpu 安裝Cpu版本 https://pytorch.org/ conda install pytorch torchvision torchaudio cpuonly -c pytorch 激活環境 conda activate cpu 驗證 退出當前分區 conda deactivate 安裝GPU版本 創建分區conda create -n gpu 激活環境 conda…

Java面向對象(高級)-- final關鍵字的使用

文章目錄 一、 final的意義二、 final的使用&#xff08;1&#xff09; final修飾類&#xff08;2&#xff09; final修飾方法&#xff08;3&#xff09; final修飾變量1. 修飾成員變量1.1 舉例11.2 舉例2 2. 修飾局部變量2.1 舉例12.2 舉例2 &#xff08;4&#xff09;final搭…

java協程操作mysql數據庫

我的項目&#xff1a; nanshaws/nettyWeb: 復習一下netty&#xff0c;并打算做一個web項目出來 (github.com) 最近在項目中分別添加了虛擬線程操作mysql數據庫&#xff0c;和用協程操作mysql數據庫 同理先跟我這個博客操作一下前面的&#xff1a;就單純代碼的時候進行修改&a…

TikTok與精神健康:社交媒體在壓力時代的作用

在當今數字化和社交化的時代&#xff0c;社交媒體已成為人們生活中不可或缺的一部分。其中&#xff0c;TikTok作為一款備受歡迎的短視頻應用&#xff0c;不僅改變了人們的娛樂方式&#xff0c;也對精神健康產生了深遠的影響。 本文將深入探討TikTok在壓力時代對精神健康的作用…

2023年中國油田工程建設市場規模現狀及行業競爭分析[圖]

油田工程建設是在確定油氣田有開發生產的價值的基礎上&#xff0c;進行系統的工程建設&#xff0c;油田工程建設包括井場建設、管道施工、土石方工程、道路建設及綠化等服務。 油田工程建設主要內容 資料來源&#xff1a;共研產業咨詢&#xff08;共研網&#xff09; 油田服務…

oapi-codegen 安裝和使用

背景描述 oapi-codegen 是代碼自動生成工具&#xff0c;其大致邏輯是&#xff1a;&#xff08;1&#xff09;編寫遵循 openAPI 規范的 yaml 格式 api 接口文檔&#xff1b;&#xff08;2&#xff09;使用 oapi-codegen 使用 yaml 文件生成 gin 框架的 server 端代碼。 除此以…

編輯 | 古代漢語知識

文章目錄 文字通假字古今字異體字&#xff08;了解&#xff09; 詞匯古漢語中的單音詞與雙音詞&#xff08;掌握&#xff09;詞的本義與引申義的特點和主要差異&#xff08;掌握&#xff09;詞的古義與今義的特點和主要差異&#xff08;掌握&#xff09;與現代漢語用法相同與現…

反向傳播BP算法

神經網絡的反向傳播 反向傳播機制與代碼微分引擎與代碼原理闡述 如需轉載&#xff0c;請注明出處&#xff01; 如有幫助點贊收藏關注&#xff01; 反向傳播機制與代碼 這里主要介紹反向傳播是如何運作的&#xff0c;代碼中會加注釋&#xff0c;便于大家理解。 在訓練神經網絡時…