🙆‍♀️

Go初心者がcontextを解説(概要説明編)

に公開

はじめに

Goで非常によく使われているcontextパッケージについて学習してみました。

contextとは?以前にお作法と言いますか、構文的なものがなかなか覚えられず(今もまだ調べながらじゃないと書けない)苦労しながら勉強しています。。
今回は勉強のメモのような感じで記事を書いていこうと思います!!

contextとは?

Go1.7から追加されたパッケージです。
役割
タイムアウトやキャンセルの伝達
リクエスト単位の情報(ユーザー情報やトークンなど)の共有
基本的には「処理の中断(キャンセル)」や「時間制限(タイムアウト)」を安全に扱うために使われます。

なぜcontextを使用するのか?

Go公式の説明ではこう書かれています
Introduction¶
In Go servers, each incoming request is handled in its own goroutine. Request handlers often start additional goroutines to access backends such as databases and RPC services. The set of goroutines working on a request typically needs access to request-specific values such as the identity of the end user, authorization tokens, and the request’s deadline. When a request is canceled or times out, all the goroutines working on that request should exit quickly so the system can reclaim any resources they are using.

At Google, we developed a context package that makes it easy to pass request-scoped values, cancellation signals, and deadlines across API boundaries to all the goroutines involved in handling a request. The package is publicly available as context. This article describes how to use the package and provides a complete working example.
と書いてありました。

要約
Goサーバーでは、1つのリクエストごとに新しい goroutine(並行処理の単位)が立ち上がります。
その中でさらに複数のgoroutineが動くこともあり、これらはユーザー情報や締切時刻(デッドライン)などの「リクエスト固有の情報」を共有します。

リクエストがキャンセルされたりタイムアウトした場合には、
関係する全てのgoroutineが速やかに終了し、リソースを解放する必要があります。

この仕組みを安全かつ簡単に実現するために作られたのが contextパッケージ です。

だそうです。。。最初は何を言っているんだ?という感じですね😅
まずは出てきた単語を一つずつ説明します。

リクエスト

サーバーがクライアントから受け取る1回の通信要求
サーバーが1回処理するHTTP通信

goroutine(ゴルーチン)

Go言語で並行処理(同時進行)を行うための軽量なスレッドのこと。

プログラムの中で「同時に動く小さな処理の単位」です。
Goでは「関数を並行で動かしたい」ときに
関数の前に go をつけるだけで簡単に起動できます。

キャンセル信号

「もうこの処理を続けなくていいよ!」という合図(通知)

デッドライン情報

処理の締め切り時間(タイムアウト)

まとめ

contextとは、
処理のキャンセルやタイムアウトを伝えるための仕組み です。

サーバーでリクエストがタイムアウトしたり、シャットダウンが行われた際に、
関連するすべての処理を安全に中断させる役割を持ちます。
そうすることでデータの不整合等を防ぐことができます。

次はもっとコードを書いて説明してみます!!

参考資料

https://go.dev/blog/context
https://amzn.asia/d/1mJkLbB

Discussion