<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在實現圖片轉碼的需求時,需要支援最大 500 個圖片下載後轉換格式;
如果是一個一個下載後轉碼,耗時太長,需要使用 goroutine 實現 500 個圖片並行下載後,並行轉碼;
但自測過程中發現,會偶現下載後只轉換了 499 個圖片或更少的情況(全部下載、轉碼成功的條件下);
然後就開始了列印紀錄檔找 bug 的過程。
因為並行時使用到了 sync 等待全部協程結束,起初以為是 sync 非同步等待出了問題;
列印紀錄檔發現,正常執行了 500 次下載,執行完成下載之後,繼續執行的轉碼操作,排除 sync 非同步等待有問題;
程式碼如下:
import ( "github.com/satori/go.uuid" "sync" ) func downloadFiles(nWait *sync.WaitGroup, urls []interface{}, successFiles *[]string, failedFiles *[]string) { // 遍歷 urls 進行下載 for _, value := range urls { go func(value interface{}) { defer nWait.Done() // 執行結束,協程減 1 fullname := config.TranscodeDownloadPath + "/" + uuid.NewV4().String() // 需要確保檔名的唯一性 (防止不同使用者同一時間操作了同一檔案,導致轉碼失敗) err := utils.DownloadCeph(value.(string), fullname) // 下載檔案 // 下載檔案狀態記錄 if err != nil { *failedFiles = append(*failedFiles, fullname) } else { *successFiles = append(*successFiles, fullname) } }(value) } } // 前端傳入的圖片 url strUrlList := req["strUrlList"] // 初始化變數 nWait := sync.WaitGroup{} // 多協程非同步等待 var successFiles []string // 下載成功檔案 var failedFiles []string // 下載失敗檔案 // 遍歷 strUrlList 進行下載 log.Error("開始下載!長度:", len(strUrlList)) nWait.Add(len(strUrlList)) // 等待協程數 downloadFiles(&nWait, strUrlList, &successFiles, &failedFiles) nWait.Wait() // 阻塞,等待完成 log.Error("下載結束!長度:", len(successFiles)) //... log.Error("下載轉碼!") //...
紀錄檔如下:
2022-10-29 21:28:51.996 ERROR services/tools.go:149 開始下載!長度:500
2022-10-29 21:28:52.486 ERROR services/tools.go:153 下載結束!長度:499
2022-10-29 21:28:52.486 ERROR services/tools.go:155 開始轉碼!
列印更詳細的紀錄檔,對 for range 迴圈內的邏輯進行排查;
在單個 for 迴圈結束時增加紀錄檔:
log.Error("下載協程結束: ", len(*successFiles))
發現一處特殊的紀錄檔:
2022-10-29 21:40:38.407 ERROR services/tools.go:35 下載協程結束: 63
2022-10-29 21:40:38.407 ERROR services/tools.go:35 下載協程結束: 64
2022-10-29 21:40:38.407 ERROR services/tools.go:35 下載協程結束: 65
2022-10-29 21:40:38.407 ERROR services/tools.go:35 下載協程結束: 65
2022-10-29 21:40:38.408 ERROR services/tools.go:35 下載協程結束: 66
2022-10-29 21:40:38.408 ERROR services/tools.go:35 下載協程結束: 67
兩次長度都是 65,切片長度沒有發生變化,同一時間點執行兩次切片 append 方法,會偶現一次失效,問題原因找到;
使用切片索引進行賦值,不再使用 append ;
修復程式碼如下:
import ( "github.com/satori/go.uuid" "sync" ) func downloadFiles(nWait *sync.WaitGroup, urls []interface{}, successFiles *[]string, failedFiles *[]string) { // 遍歷 urls 進行下載 for index, value := range urls { go func(index int, value interface{}) { defer nWait.Done() // 執行結束,協程減 1 fullname := config.TranscodeDownloadPath + "/" + uuid.NewV4().String() // 需要確保檔名的唯一性 (防止不同使用者同一時間操作了同一檔案,導致轉碼失敗) err := utils.DownloadCeph(value.(string), fullname) // 下載檔案 // 下載檔案狀態記錄 if err != nil { (*failedFiles)[index] = fullname } else { (*successFiles)[index] = fullname } }(index, value) } } // 前端傳入的圖片 url strUrlList := req["strUrlList"] // 初始化變數 nWait := sync.WaitGroup{} // 多協程非同步等待 successFiles := make([]string, len(strUrlList), len(strUrlList)) // 下載成功檔案 failedFiles := make([]string, len(strUrlList), len(strUrlList)) // 下載失敗檔案 // 遍歷 strUrlList 進行下載 nWait.Add(len(strUrlList)) // 等待協程數 downloadFiles(&nWait, strUrlList, &successFiles, &failedFiles) nWait.Wait() // 阻塞,等待完成
以上就是go高並行時append方法偶現錯誤解決分析的詳細內容,更多關於go高並行append錯誤的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45