第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

這段帶有無(wú)緩沖通道的代碼會(huì)導(dǎo)致 Go 中的 goroutine 泄漏嗎?

這段帶有無(wú)緩沖通道的代碼會(huì)導(dǎo)致 Go 中的 goroutine 泄漏嗎?

Go
侃侃爾雅 2023-06-19 17:03:47
我在用goroutines和channels寫一些golang并發(fā)代碼,懷疑我的代碼可能會(huì)導(dǎo)致goroutine泄露。我的情況類似下面的代碼,或者你可以打開這個(gè)go playground鏈接。func main() {? ? numCount := 3? ? numChan := make(chan int)? ? for i := 0; i < numCount; i++ {? ? ? ? go func(num int) {? ? ? ? ? ? fmt.Printf("Adding num: %d to chan\n", num)? ? ? ? ? ? numChan <- num? ? ? ? ? ? fmt.Printf("Adding num: %d to chan Done\n", num)? ? ? ? }(i)? ? }? ? time.Sleep(time.Second)? ? panic("Goroutine Resource Leak Test")}?在我看來(lái),當(dāng)主 goroutine 返回時(shí),三個(gè) goroutine 被阻止發(fā)送到無(wú)緩沖通道,并且會(huì)出現(xiàn) goroutine 泄漏。表明So only if the channel was unbuffered the leak would occur.Go 編程語(yǔ)言建議:我們可以在測(cè)試期間使用一個(gè)方便的技巧:如果我們不在取消事件中從 main 返回,而是執(zhí)行對(duì) panic 的調(diào)用,那么運(yùn)行時(shí)將轉(zhuǎn)儲(chǔ)程序中每個(gè) goroutine 的堆棧。如果主 goroutine 是唯一剩下的 goroutine,那么它已經(jīng)完成了自己的清理工作。但是如果還有其他goroutines,可能是沒(méi)有正確取消,或者已經(jīng)取消了,但是取消需要時(shí)間;進(jìn)行一些調(diào)查可能是值得的。恐慌轉(zhuǎn)儲(chǔ)通常包含足夠的信息來(lái)區(qū)分這些情況。因此,我panic("Goroutine Resource Leak Test")在 main 函數(shù)的末尾添加來(lái)驗(yàn)證我的假設(shè)。但是,panic dump 僅包含 main goroutine,即沒(méi)有資源泄漏。Adding num: 0 to chanAdding num: 1 to chanAdding num: 2 to chanpanic: Goroutine Resource Leak Testgoroutine 1 [running]:main.main()? ? /tmp/sandbox011109649/prog.go:21 +0xc0誰(shuí)能幫忙解釋一下為什么沒(méi)有 goroutine 泄漏,或者如果有泄漏,我應(yīng)該如何獲得正確的恐慌轉(zhuǎn)儲(chǔ)任何建議將不勝感激,在此先感謝!
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊

您的代碼的問(wèn)題是雙重的。

首先,理論上存在goroutine泄漏,因?yàn)槿魏蜗蛉萘繛榱愕耐ǖ溃o(wú)緩沖通道或已滿緩沖通道)發(fā)送值的嘗試都會(huì)阻塞發(fā)送 goroutine,直到在該通道上完成接收操作。

所以,是的,根據(jù)通道工作方式的定義,所有三個(gè) goroutine 都將在numChan <- num語(yǔ)句中被阻止。

其次,由于 Go 的一些修改,panic默認(rèn)情況下未處理的只轉(zhuǎn)儲(chǔ)恐慌 goroutine 的堆棧跟蹤。如果你想轉(zhuǎn)儲(chǔ)所有活動(dòng)的 goroutines 的堆棧,你必須調(diào)整運(yùn)行時(shí)——來(lái)自包的文檔runtime

GOTRACEBACK變量控制當(dāng) Go 程序由于未恢復(fù)的恐慌或意外的運(yùn)行時(shí)條件而失敗時(shí)生成的輸出量。默認(rèn)情況下,失敗會(huì)打印當(dāng)前 goroutine 的堆棧跟蹤,省略運(yùn)行時(shí)系統(tǒng)內(nèi)部的函數(shù),然后以退出代碼 2 退出。如果沒(méi)有當(dāng)前 goroutine 或失敗是,則失敗會(huì)打印所有 goroutine 的堆棧跟蹤運(yùn)行時(shí)內(nèi)部。GOTRACEBACK=none完全省略 goroutine 堆棧跟蹤。GOTRACEBACK=single(默認(rèn)值)的行為如上所述。GOTRACEBACK=all為所有用戶創(chuàng)建的 goroutines 添加堆棧跟蹤。GOTRACEBACK=system類似于“all”,但為運(yùn)行時(shí)函數(shù)添加堆棧幀并顯示運(yùn)行時(shí)內(nèi)部創(chuàng)建的 goroutine。GOTRACEBACK=crash類似于“系統(tǒng)”,但以特定于操作系統(tǒng)的方式崩潰而不是退出。例如,在 Unix 系統(tǒng)上,崩潰SIGABRT引發(fā)核心轉(zhuǎn)儲(chǔ)。由于歷史原因,GOTRACEBACK設(shè)置 0、1 和 2 分別是 none、all 和 system 的同義詞。The runtime/debugpackage 的SetTraceback功能允許在運(yùn)行時(shí)增加輸出量,但它不能減少到低于環(huán)境變量指定的量。


另請(qǐng)注意,您不能使用計(jì)時(shí)器進(jìn)行(模擬)同步:在玩具示例中,這可能有效,但在現(xiàn)實(shí)生活中,沒(méi)有什么能阻止您的三個(gè) goroutine 在您的主 goroutine 在調(diào)用中花費(fèi)的時(shí)間跨度內(nèi)沒(méi)有機(jī)會(huì)運(yùn)行到time.Sleep——所以結(jié)果可能是任何數(shù)量的派生 goroutines 已經(jīng)運(yùn)行:從 0 到 3。

在那里添加一個(gè)事實(shí),即當(dāng)main退出運(yùn)行時(shí)時(shí),運(yùn)行時(shí)只會(huì)殺死所有未完成的活動(dòng) goroutines,并且測(cè)試結(jié)果充其量可能是令人驚訝的。

因此,一個(gè)適當(dāng)?shù)慕鉀Q方案是

  • 僅在需要的地方打印堆棧,

  • 確保通過(guò)匹配的接收同步發(fā)送:

package main


import (

? ? "fmt"

? ? "log"

? ? "runtime"

)


func dumpStacks() {

? ? buf := make([]byte, 32 * 1024)

? ? n := runtime.Stack(buf, true)

? ? log.Println(string(buf[:n]))

}


func main() {

? ? numCount := 3

? ? numChan := make(chan int, numCount)


? ? for i := 0; i < numCount; i++ {

? ? ? ? go func(num int) {

? ? ? ? ? ? fmt.Printf("Adding num: %d to chan\n", num)

? ? ? ? ? ? numChan <- num

? ? ? ? ? ? fmt.Printf("Adding num: %d to chan Done\n", num)

? ? ? ? }(i)

? ? }


? ? dumpStacks()


? ? for i := 0; i < numCount; i++ {

? ? ? ? <-numChan

? ? }

}

游樂(lè)場(chǎng)



查看完整回答
反對(duì) 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)