校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > golang中for循環遍歷channel時需要注意的問題詳解

golang中for循環遍歷channel時需要注意的問題詳解

熱門標簽:浙江高頻外呼系統多少錢一個月 濱州自動電銷機器人排名 釘釘有地圖標注功能嗎 汕頭小型外呼系統 鄭州亮點科技用的什么外呼系統 黃岡人工智能電銷機器人哪個好 惠州電銷防封電話卡 建造者2地圖標注 阿里云ai電話機器人

前言

for循環是Go語言唯一的循環結構,最近在做一個基于RabbitMQ的應用,由于官方的qos沒有golang的版本,所以出了一點問題。

問題代碼如下:

_, ch, err := component.NewRabbitMQ()
if err != nil {
 panic(err)
}
if err := ch.Qos(10, 0, true); err != nil {
 panic(err)
}
msgs, err := ch.Consume("push", "", false, false, false, false, nil)
if err != nil {
 panic(err)
}
for m := range msgs {
 go func(d *amqp.Delivery) {
   defer func() { d.Ack(false) }
   // 處理消息
  }(m)
 }

發現消費到10條消息,進程就退出了,但是exit code為0,表示系統是正常退出,由于做了日志記錄可以確定消費了10條,所以初步確定是qos相關問題。

排查過程

  • 首先是把d的tag打印出來,發現全部是一樣的,可以確定是重復的一條消息
  • 一開始想到可能是經典的go協程執行在for循環結束以后導致的,但是看我的代碼不屬于這種情況,有使用m保證每一條消息都是不同循環傳入的。所以判斷可能是for循環的傳遞問題。
  • 確定方向之后開始寫了一個測試項目用來驗證我的想法是否正確。

測試代碼

package main
import "fmt"
func main() {
 ch := make(chan int, 10)
 for i := 0; i  10; i++ {
 ch - i
 }
 close(ch)
 for v := range ch {
 fmt.Println(v)
 }
}

執行輸出

0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008
0xc420086008

到這里才煥然大悟,for循環中,如果循環變量不是指針,那么每次的變量是同一個,不過值變了。,所以上例中的RabbitMQ go協程消費消息那里,需要直接傳遞值而不是指針,經過測試之后發現,問題確實解決了。

題外話

測試代碼那里,如果不close掉channel是會發生死鎖的,原因是 當for循環讀完channel的10個值之后會繼續嘗試讀取下一個,而由于channel為空又沒關閉,會一直阻塞形成死鎖

TOOD

研究RabbitMQ Consumer部分的源碼來看看消費channel被關閉的問題。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • 基于golang channel實現的輕量級異步任務分發器示例代碼
  • golang實現基于channel的通用連接池詳解
  • Golang優雅關閉channel的方法示例
  • golang中單向channel的語法介紹
  • golang判斷chan channel是否關閉的方法
  • Golang中channel使用的一些小技巧
  • Golang中channel的原理解讀(推薦)

標簽:泰安 瀘州 東營 阿壩 駐馬店 晉中 滄州 昭通

巨人網絡通訊聲明:本文標題《golang中for循環遍歷channel時需要注意的問題詳解》,本文關鍵詞  golang,中,for,循環,遍歷,channel,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《golang中for循環遍歷channel時需要注意的問題詳解》相關的同類信息!
  • 本頁收集關于golang中for循環遍歷channel時需要注意的問題詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 元谋县| 枣庄市| 连云港市| 大余县| 天峻县| 镇平县| 金湖县| 乳山市| 宁都县| 漾濞| 嘉兴市| 沙雅县| 昭觉县| 博客| 景洪市| 米脂县| 桐乡市| 镇远县| 泗洪县| 安平县| 海南省| 兰坪| 盱眙县| 米林县| 滦平县| 高淳县| 托里县| 梁河县| 乌苏市| 晋江市| 苍溪县| 万安县| 三江| 涡阳县| 灵川县| 凤凰县| 新建县| 易门县| 关岭| 彰武县| 古浪县|