go / expert
Snippet
Asynchrone Aufgabenorchestrierung via Context-AfterFunc-Registrierung
Go 1.21 hat context.AfterFunc eingeführt, wodurch ein Closure nach der Kontext-Stornierung in einer eigenen Goroutine ausgeführt wird. Der Aufruf von stopFunc hebt die Registrierung auf. Wenn stopFunc true zurückgibt, wurde die Ausführung des Callbacks verhindert, was eine deterministische Ressourcenbereinigung und wettlauffreie Beendigungs-Koordination ermöglicht.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package mainimport ("context""fmt""sync""time")func executeOrchestratedTask(ctx context.Context) error {var wg sync.WaitGroupwg.Add(1)stopFunc := context.AfterFunc(ctx, func() {fmt.Println("Context cancelled: Aborting background worker...")wg.Done()})go func() {defer wg.Done()select {case <-time.After(100 * time.Millisecond):if stopFunc() {fmt.Println("Task completed successfully before context deadline.")}case <-ctx.Done():return}}()wg.Wait()return ctx.Err()}func main() {ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)defer cancel()_ = executeOrchestratedTask(ctx)}
Erklärung
1
stopFunc := context.AfterFunc(ctx, func() {
Registriert einen Callback, der asynchron ausgeführt wird, sobald der Kontext eine Stornierung signalisiert.
2
if stopFunc() {
Versucht die Registrierung des Callbacks aufzuheben; gibt true zurück, wenn dies vor der Ausführung gelang.