Go の並行処理

Go context: Cancellation and Timeouts

Stop work that takes too long or is no longer needed with context.WithTimeout and WithCancel.

  • 上級
  • 約3分で読めます
  • 実行できるサンプル 1 件
学べること
  • context.WithTimeout
  • ctx.Done()
  • context.WithCancel
Timeout of 50 ms
5 ms of worknil, finished in time
500 ms of workcontext deadline exceeded
after stop()context canceled

A cancellation signal passed down

A context carries a cancellation signal through your program. Functions that may take a long time accept a context and stop when it is cancelled or its deadline passes.

WithTimeout creates a context that is cancelled after 50 milliseconds. slowOperation waits for either its work or ctx.Done(), whichever comes first, and returns ctx.Err() when the context wins. WithCancel returns a function that cancels the context by hand.

重要なポイント

  1. A context is cancelled by a deadline or by hand.
  2. ctx.Done() is a channel that closes on cancel.
  3. ctx.Err() says why.

実行できる Go のサンプル

Go
コードを実行 →
main.go
package main

import (
	"context"
	"fmt"
	"time"
)

func slowOperation(ctx context.Context, duration time.Duration) error {
	select {
	case <-time.After(duration):
		return nil
	case <-ctx.Done():
		return ctx.Err()
	}
}

func main() {
	ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
	defer cancel()

	fmt.Println("quick:", slowOperation(ctx, 5*time.Millisecond))
	fmt.Println("slow:", slowOperation(ctx, 500*time.Millisecond))

	manual, stop := context.WithCancel(context.Background())
	stop()
	fmt.Println("cancelled:", slowOperation(manual, time.Second))
}
この例の実行ボタンを作成 実行結果
quick: <nil>
slow: context deadline exceeded
cancelled: context canceled

練習

サンプルをオンラインコンパイラーで開き、値を変えたり行を追加したりして、実行する前に出力を予想してみましょう。次に、わざとコードを壊してコンパイラーのメッセージを読んでみてください。

このレッスンを終えましたか?

学習済みにすると進み具合を記録できます。

チャレンジで練習する

このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。

すべてのチャレンジ