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

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

如何等待恐慌的協(xié)程?

如何等待恐慌的協(xié)程?

Go
富國(guó)滬深 2023-06-01 17:53:16
等待 goroutine 的常見(jiàn)方法是使用*sync.WaitGroup:func main() {    wg := &sync.WaitGroup{}    wg.Add(1)    go func() {        defer wg.Done()        // Long running task    }()    wg.Wait()}這里沒(méi)有問(wèn)題。然而,這個(gè)呢:func main() {    wg := &sync.WaitGroup{}    wg.Add(1)    go func() {        defer wg.Done()        // Long running task        panic("Something unexpected happened.")    }()    wg.Wait()}在這種情況下,當(dāng)wg.Done()被調(diào)用時(shí),我相信main()可以在沒(méi)有panic()寫入stdout/的細(xì)節(jié)的情況下退出stderr。這是真的嗎?如果是,我該如何防止它發(fā)生?
查看完整描述

3 回答

?
LEATH

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

無(wú)論如何都會(huì)panic終止進(jìn)程,因?yàn)闆](méi)有人從中恢復(fù)。如果你想在一個(gè) goroutine 中從 panic 中恢復(fù),你必須將recover調(diào)用堆棧包裝在同一個(gè) goroutine 中。

wg.Done在這種情況下,將由defer聲明調(diào)用。但是這個(gè)過(guò)程可能會(huì)在主 goroutine 完成之前結(jié)束wg.Wait。


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
MMTTMM

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

參考src/builtin/builtin.go

panic 內(nèi)置函數(shù)停止當(dāng)前 goroutine 的正常執(zhí)行。當(dāng)函數(shù) F 調(diào)用 panic 時(shí),F(xiàn) 的正常執(zhí)行會(huì)立即停止。任何被 F 延遲執(zhí)行的函數(shù)都以通常的方式運(yùn)行,然后 F 返回給它的調(diào)用者。對(duì)于調(diào)用者 G,調(diào)用 F 就像調(diào)用 panic,終止 G 的執(zhí)行并運(yùn)行任何延遲函數(shù)。這一直持續(xù)到執(zhí)行 goroutine 中的所有函數(shù)都以相反的順序停止。此時(shí),程序終止并報(bào)告錯(cuò)誤情況,包括 panic 的參數(shù)值。這種終止序列稱為 panicing,可以通過(guò)內(nèi)置函數(shù) recover 來(lái)控制。

之后panic,defer將調(diào)用 func。

在操場(chǎng)上檢查一下:https ://play.golang.org/p/yrXkEbE1Af7

package main


import (

? ? "sync"

? ? "fmt"

)


func main() {

? ? wg := &sync.WaitGroup{}

? ? wg.Add(1)

? ? go func() {

? ? ? ? defer func(){

? ? ? ? ? ? fmt.Println("expected to be called after panic")

? ? ? ? ? ? wg.Done()

? ? ? ? }()

? ? ? ? // Long running task

? ? ? ? panic("Something unexpected happened.")

? ? }()

? ? wg.Wait()

}

輸出


expected to be called after panic

panic: Something unexpected happened.


goroutine 5 [running]:

main.main.func1(0x416020, 0x0)

? ? /tmp/sandbox946785562/main.go:17 +0x60

created by main.main

? ? /tmp/sandbox946785562/main.go:11 +0x80

那么你的第二個(gè)問(wèn)題,“如何防止這種情況發(fā)生?”


如前所述,您可以recover在panic


游樂(lè)場(chǎng):https://play.golang.org/p/76pPrCVYN8u


package main


import (

? ? "sync"

? ? "fmt"

)


func main() {

? ? wg := &sync.WaitGroup{}

? ? wg.Add(1)

? ? go func() {

? ? ? ? defer func(){

? ? ? ? ? ? if x:=recover();x!=nil{

? ? ? ? ? ? ? ? fmt.Printf("%+v\n",x)

? ? ? ? ? ? }

? ? ? ? ? ? wg.Done()

? ? ? ? }()

? ? ? ? // Long running task

? ? ? ? panic("Something unexpected happened.")

? ? }()

? ? wg.Wait()

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

? ? ? ? fmt.Println(i)

? ? }

}

輸出


Something unexpected happened.

0

1

2

3

4

5

6

7

8

9


查看完整回答
反對(duì) 回復(fù) 2023-06-01
?
吃雞游戲

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

可以通過(guò)添加來(lái)引發(fā)不需要的行為defer time.Sleep(time.Second):


func main() {

? ? wg := &sync.WaitGroup{}

? ? wg.Add(1)

? ? go func() {

? ? ? ? defer time.Sleep(time.Second)

? ? ? ? defer wg.Done()

? ? ? ? // Long running task

? ? ? ? panic("Something unexpected happened.")

? ? }()

? ? wg.Wait()

}

D:\Projects\Code\Go\src\zyl\testexit>go build .

D:\Projects\Code\Go\src\zyl\testexit>.\testexit.exe

D:\Projects\Code\Go\src\zyl\testexit>echo %errorlevel%

0

該問(wèn)題的解決方案是不延遲調(diào)用Done()并將其放在最后:


func main() {

? ? wg := &sync.WaitGroup{}

? ? wg.Add(1)

? ? go func() {

? ? ? ? // Long running task which might panic

? ? ? ? wg.Done()

? ? }()

? ? wg.Wait()

}

在上面的代碼中,不存在對(duì) go routine 行為的實(shí)現(xiàn)細(xì)節(jié)的依賴,并且在發(fā)生 panic 時(shí)總是會(huì)失敗。


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

添加回答

舉報(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)