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

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

為什么當(dāng)我超時(shí)函數(shù)時(shí)不調(diào)用延遲?

為什么當(dāng)我超時(shí)函數(shù)時(shí)不調(diào)用延遲?

Go
瀟瀟雨雨 2023-05-08 14:36:25
當(dāng)我在函數(shù)中添加延遲時(shí),我希望它在函數(shù)結(jié)束時(shí)始終被調(diào)用。我注意到當(dāng)函數(shù)超時(shí)時(shí)它不會(huì)發(fā)生。package mainimport (    "context"    "fmt"    "time")func service1(ctx context.Context, r *Registry) {    ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)    defer func() {        r.Unset("service 1")    }()    r.Set("service 1")    go service2(ctx, r)    select {    case <-ctx.Done():        cancel()        break    } } func service2(ctx context.Context, r *Registry) {    defer func() {        r.Unset("service 2")    }()    r.Set("service 2")    time.Sleep(time.Millisecond * 300) }         type Registry struct {    entries map[string]bool } func (r *Registry)Set(key string) {    r.entries[key] = true } func (r *Registry)Unset(key string)  {    r.entries[key] = false } func (r *Registry)Print() {    for key, val := range r.entries  {        fmt.Printf("%s -> %v\n", key, val)    } } func NewRegistry() *Registry {    r := Registry{}    r.entries = make(map[string]bool)    return &r }func main() {    r := NewRegistry()    ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*200)    go service1(ctx, r)    // go service3(ctx, r)    select {    case <-ctx.Done():        fmt.Printf("context err: %s\n", ctx.Err())        cancel()    }    r.Print() }在上面的示例中,永遠(yuǎn)不會(huì)調(diào)用 defer in service2(),這就是輸出的原因:service 1 -> falseservice 2 -> true代替service 1 -> falseservice 2 -> false我知道超時(shí)意味著“停止執(zhí)行”,但對(duì)我來(lái)說(shuō)執(zhí)行延遲代碼是合理的。我找不到對(duì)此行為的任何解釋。問(wèn)題的第二部分 - 如何修改服務(wù)或Registry抵抗這種情況?
查看完整描述

1 回答

?
手掌心

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

第一部分的答案

f1()假設(shè)您有一個(gè)用于defer調(diào)用的函數(shù)f2(),即defer f2()。事實(shí)上,即使發(fā)生運(yùn)行時(shí)恐慌,f2當(dāng)且僅當(dāng)完成時(shí)才會(huì)調(diào)用。

現(xiàn)在我們關(guān)心的是在 goroutine 中使用 defer。我們還必須記住,如果 go-routine 的父函數(shù)完成退出,它就會(huì)退出。

因此,如果我們defer在一個(gè) go-routine 函數(shù)中使用,那么如果父函數(shù)完成或退出,則 go-routine 函數(shù)必須退出。由于它退出(未完成),該defer語(yǔ)句將不會(huì)執(zhí)行。很明顯,我們繪制了您程序的狀態(tài)。

http://img3.sycdn.imooc.com/6458987e0001a2be06520361.jpg

如你所見(jiàn),

  • 在第 1 毫秒,service1()先于其他人完成。因此,service2()不執(zhí)行defer語(yǔ)句就退出,并且“服務(wù) 2”不會(huì)設(shè)置為false.?完成后service1(),它將defer執(zhí)行并將“服務(wù) 1”設(shè)置為false。

  • 在第 2 毫秒,main()完成并程序結(jié)束。

所以我們看看這個(gè)程序是如何執(zhí)行的。

第二部分的答案

我嘗試過(guò)的一種可能的解決方案是增加時(shí)間service1()或減少時(shí)間service2()


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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