1. 序章

このチュートリアルでは、コールバック関数とは何か、およびそれらを何に使用するかについて説明します。

2. コールバック関数とは何ですか?

Callback 関数は、他の関数にパラメーターとしてフィードする関数です。 コールバック関数を引数として受け取るコードは、その定義内で「呼び出す」と推定されます。

コールバック関数は、別のコードブロックが終了したときに実行されることが多いため、「コールアフター」関数とも呼ばれます。 プログラミング言語は、ラムダ関数関数参照など、さまざまな方法でこれらのタイプのルーチンをサポートしています。

2.1. 例

正式には、コールバック関数は次のように記述できます。 2つの関数があると仮定しましょう:と。 結果を計算するために処理する出力を生成します。

通常の場合、メインプログラムが実行され、戻り値が呼び出されます。

コールバックの場合、引数として:に渡します。コールバックアプローチは、関数の本体のどこかに、への呼び出しがあることを意味します。

3. 同期コールバック

一般的なコールバックは、別の関数で呼び出される関数です。 一般的なコールバックは、同期コールバックの例です。 これらのコールバックはblockingであり、最初の関数が戻る前に呼び出されます。

例えば:

擬似コードでは、関数 printCallBack が、引数として受け取ったコールバック関数の戻り値を出力していることがわかります。 さまざまなコールバック関数を提供することで、さまざまな結果を出力します。

4. 非同期コンテキストでのコールバック関数

さらに興味深いのは、コールバックに非同期呼び出しが含まれる場合です。

4.1. 非同期コールのコールバック

たとえば、データベースへの更新呼び出しとそれに続く読み取り呼び出しを考えてみましょう。 更新呼び出しが非同期の場合、読み取り要求の後に更新が終了する可能性があります。 その場合、読み取り操作の結果には更新されたデータが含まれません。 コールバック関数を使用すると、この問題が修正されます。

まず、コールバックなしの単純な実装を見てみましょう。

これにより、誤った結果が生じる可能性があります。読み取り操作により、更新前のデータベースの状態が出力される場合があります。 これは、更新前に読み取り操作が完了した場合に発生する可能性があります。

コールバックアプローチに従うことで、このような誤った読み取りを回避できます。

これで、読み取り要求は、更新関数のパラメーターとして指定するコールバック関数になります。 コールバックは、更新関数が終了した後に実行され、更新されたデータを返します。 したがって、取得する結果は、更新前の状態ではなく、現在のデータベースの状態です。

4.2. 非同期コールバック

期間が長いまたは可変のサービス呼び出しまたは関数の場合、コールバック関数が返されるのを待ちたくない場合があります。 このような場合、元の関数が終了したときにさらに実行するための引数として、非同期コールバック関数を渡します。 非同期コールバック関数は、元の関数が戻った後に実行できます。

これは、データベースの例のコールバックとどのように異なりますか? そこでは、非同期コンテキストで同期コールバックを使用しました。 対照的に、このユースケースではコールバックは非同期です。 ほとんどの場合、イベント処理( Spring など)またはI/O操作に非同期コールバックを使用します。 一般的な例には、エラー処理やシステム割り込みが含まれます。

5. コールバック関数の実際の例

多くの種類のソフトウェアでコールバック関数を見つけることができます。 このセクションでは、コールバックの2つの一般的な例を示します。ブラウザでの例と、ニューラルネットワークのトレーニングに使用する例です。

5.1. ブラウザの非同期機能

非同期呼び出しは、JavaScriptなどの最新のブラウザー言語で広く使用されるようになりました。 これらの呼び出しにはブロックされないという利点があるため、バックグラウンドで(および並行して)呼び出しを処理している間、ブラウザーは応答性を維持します。

コールバック関数は、非同期呼び出しの戻り値を処理します。ブラウザーは、非同期呼び出しが戻るのを待たずに、他のタスクを続行するためです。

たとえば、ユーザーがボタンをクリックしたときにWebサイトがAPIにデータを要求するとします。 同期設定では、APIがデータを返すまでブラウザはブロックします。

ただし、クリック時に非同期コールバック関数を使用してAPIデータを受信および印刷すると、問題が解決します。 これにより、ユーザーはAPIリクエストの実行が終了するのを待たずに、Webサイトの応答性を維持できます。

5.2. ニューラルネットワークトレーニングのコールバック関数

さらに、ニューラルネットワークをトレーニングするときにコールバックが役立ちます。 コールバックを使用して、トレーニング関数は高レベルのAPIトレーニング手順に機能を追加します。 これにより、高度なロギング、モデルの保存、早期停止などの機能を組み込むことができます。

これは何を意味するのでしょうか? ええと、コールバック関数は、トレーニングのエポックが終了するたびに、つまりつまり、すべてのトレーニングステップの終わりに実行されます。 コールバックを使用すると、ユーザーは各エポックの後に実行するAPIの追加操作を指定できます。

KerasAPIでモデルのfit関数にコールバックを与える方法は次のとおりです。

my_callbacks = [
    tf.keras.callbacks.EarlyStopping(patience=2),
    tf.keras.callbacks.ModelCheckpoint(filepath='model.{epoch}-{val_loss}.h5')
]
model.fit(dataset, epochs=10, callbacks=my_callbacks)

ここでは、コールバックルーチンに早期打ち切りと忍耐力2および自動モデルチェックポイントを追加しました。

6. 結論

この記事では、コールバック関数とは何か、そしてそれらが何を意味するのかを示しました。 さらに、コールバック関数が一般的に使用される方法の例をいくつか示しました。