Heim > Backend-Entwicklung > Golang > Ist das mit defer cancel() sinnvoll?

Ist das mit defer cancel() sinnvoll?

王林
Freigeben: 2024-02-12 13:45:06
nach vorne
926 Leute haben es durchsucht

这对于 defer cancel() 有意义吗?

Ist der Frageinhalt

in http.HandlerFunc 中我得到了这个。但我的问题是:在应用超时上下文之后放置 defer cancel() sinnvoll?

Weil die untere Auswahl weiter zuhört, bis der Kontext abgeschlossen ist. Und die Verzögerung wird ausgeführt, nachdem der Kontext abgeschlossen ist. Aber ist das erledigt? :)

//  Apply timeout context
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second))
defer cancel() // <--- does this make sense

go func(){
    match_route.handler(w, r.WithContext(ctx))
    cancel()
}()

select {
case <-ctx.Done():
    if ctx.Err() == context.DeadlineExceeded {
        http.Error(w, "Timeout", http.StatusRequestTimeout)
    }
}
Nach dem Login kopieren

Workaround

Ja, ich denke, das macht Sinn. Verwenden Sie tatsächlich die defer cancel() 的目的是确保调用 cancel 函数来释放与上下文关联的资源,无论函数如何退出,在您的示例中, cancel() 函数被推迟到 http.HandlerFunc 完成后或上下文完成时执行,因此 go func() 负责使用提供的上下文执行 match_route.handler 函数,然后调用 cancel()显式取消上下文,select-Anweisung, um zu warten, bis der Kontext abgeschlossen ist. Wenn der Kontext aufgrund einer Fristüberschreitung abgeschlossen wird, wird eine Fehlerantwort zurückgegeben!

Das obige ist der detaillierte Inhalt vonIst das mit defer cancel() sinnvoll?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage