Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 12472] ファイルの概要

このコミットは、Go言語の公式ドキュメントである doc/effective_go.htmlinit 関数に関するセクションを更新するものです。具体的には、init 関数内でのゴルーチン(goroutine)の振る舞いに関する記述が修正されています。

コミット

commit e8d1852d6a46caf5d7a00642dd9abf75b5a28098
Author: Russ Cox <rsc@golang.org>
Date:   Wed Mar 7 11:38:39 2012 -0500

    doc: update Effective Go init section
    
    Goroutines are no longer excluded from init.
    
    Fixes #3232.
    
    R=golang-dev, gri
    CC=golang-dev
    https://golang.org/cl/5764044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/e8d1852d6a46caf5d7a00642dd9abf75b5a28098

元コミット内容

doc: update Effective Go init section Goroutines are no longer excluded from init. Fixes #3232.

変更の背景

このコミットの背景には、Go言語の init 関数とゴルーチンの実行に関する初期の設計と、その後の変更があります。Go言語の初期バージョンでは、init 関数内で起動されたゴルーチンは、init 関数が完了するまで実行が開始されないという制限がありました。これは、プログラムの初期化フェーズが単一のスレッドで完全に完了することを保証するためのものでした。

しかし、この制限は特定のシナリオで開発者を混乱させたり、不必要な制約となったりする可能性がありました。例えば、init 関数内で非同期のセットアップ処理を開始したい場合などです。Go言語の開発チームは、この挙動が必ずしも必要ではないと判断し、init 関数内でのゴルーチンの即時実行を許可するようにランタイムの挙動を変更しました。

このコミットは、そのランタイムの変更に合わせて、公式ドキュメントである「Effective Go」の記述を更新することを目的としています。具体的には、Issue #3232 で報告された問題(init 関数内でのゴルーチンの実行に関する誤解や混乱)を修正しています。

前提知識の解説

このコミットを理解するためには、以下のGo言語の基本的な概念を理解しておく必要があります。

  • init 関数: Go言語において、各パッケージは init 関数を定義できます。この関数は、パッケージがインポートされ、そのパッケージ内のすべての変数が初期化された後に自動的に呼び出されます。main パッケージの main 関数が実行される前に、すべてのインポートされたパッケージの init 関数が依存関係の順序で実行されます。init 関数は、プログラムの起動時に一度だけ実行される初期化処理(例: データベース接続の確立、設定ファイルの読み込み、レジストリへの登録など)に使用されます。

  • ゴルーチン (Goroutine): ゴルーチンは、Go言語における軽量な並行実行単位です。go キーワードを使って関数呼び出しの前に記述することで、その関数を新しいゴルーチンとして実行できます。ゴルーチンはOSのスレッドよりもはるかに軽量であり、数千、数万のゴルーチンを同時に実行することが可能です。Goランタイムは、これらのゴルーチンを少数のOSスレッドにマッピングし、効率的にスケジューリングします。

  • Effective Go: 「Effective Go」は、Go言語の公式ドキュメントの一部であり、Go言語を効果的に記述するための慣用的なスタイル、パターン、およびヒントを提供します。これは、Go言語の設計思想とベストプラクティスを理解するための重要なリソースです。

技術的詳細

このコミットの技術的な詳細は、Goランタイムの初期化プロセスとゴルーチンのスケジューリングに関する変更に起因します。

変更前のGoランタイムでは、init 関数が実行されている間は、init 関数内で go キーワードを使って起動されたゴルーチンであっても、その実行は一時停止され、init 関数が完全に終了するまで開始されませんでした。これは、初期化フェーズの予測可能性と、初期化中に発生する可能性のある競合状態を避けるための設計上の決定でした。

しかし、この挙動は、特に初期化中にネットワークリソースへのアクセスや、時間のかかる非同期処理を開始したい場合に、開発者にとって直感的ではない、あるいは不便なものとなることがありました。Go言語の設計者は、この制限がもたらすメリットよりも、柔軟性の欠如というデメリットの方が大きいと判断したと考えられます。

このコミットが行われた時点(2012年3月)までに、Goランタイムは変更され、init 関数内で起動されたゴルーチンも、他のゴルーチンと同様に即座にスケジューリングされ、実行を開始するようになりました。これにより、init 関数内でも並行処理をより柔軟に利用できるようになりました。

このドキュメントの変更は、このランタイムの挙動変更を反映し、古い、もはや正確ではない記述を削除することで、開発者がGo言語の init 関数とゴルーチンの挙動について正しく理解できるようにしています。

コアとなるコードの変更箇所

--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -1761,10 +1761,7 @@ var (
 <p>
 Finally, each source file can define its own niladic <code>init</code> function to
 set up whatever state is required.  (Actually each file can have multiple
-<code>init</code> functions.) The only restriction is that, although
-goroutines can be launched during initialization, they will not begin
-execution until it completes; initialization always runs as a single thread
-of execution.
+<code>init</code> functions.)
 And finally means finally: <code>init</code> is called after all the
 variable declarations in the package have evaluated their initializers,
 and those are evaluated only after all the imported packages have been

コアとなるコードの解説

変更は doc/effective_go.html ファイルの1761行目付近にあります。

削除された行:

-<code>init</code> functions.) The only restriction is that, although
-goroutines can be launched during initialization, they will not begin
-execution until it completes; initialization always runs as a single thread
-of execution.

この削除された部分は、init 関数に関する以前の制限を説明していました。具体的には、init 関数内でゴルーチンを起動できるものの、init 関数が完了するまでそのゴルーチンは実行を開始せず、初期化は常に単一のスレッドで実行される、という内容でした。

追加された行:

+<code>init</code> functions.)

追加された行は、削除された行の直前の文の閉じ括弧 ) の後に続くもので、実質的には何も新しい情報を追加していません。これは、削除された制限に関する記述が不要になったため、その部分を丸ごと削除し、文脈を維持するために行われた変更です。

この変更により、「Effective Go」の init 関数に関するセクションは、Goランタイムの現在の挙動、つまり init 関数内で起動されたゴルーチンが即座に実行を開始するという事実を正確に反映するようになりました。これにより、開発者はGo言語の初期化プロセスと並行処理の挙動について、より正確な情報を得ることができます。

関連リンク

参考にした情報源リンク