#コールバック関数の初期要件の背景
コールバック関数に関して私が思いつく最も古いシナリオは、システム プログラミングです。使用した会議。 プログラミングは 2 つのカテゴリに分類されます:#● システム プログラミング
#● アプリケーション プログラミング
(推奨学習:
Python ビデオ チュートリアル システムプログラミングとは:システムプログラミングとは、簡単に言うと、さまざまな関数のライブラリを書くことです。たとえば、Windows の win32 ライブラリと gdi32 ライブラリ、win32 はホスト ハードウェアとシステム層の関数を呼び出すことができ、gdi32 はグラフィックの描画に使用できます。これらのライブラリは、アプリケーションを作成する人が呼び出すのを待っているだけです。
アプリケーション プログラミングとは:アプリケーション プログラミングとは、特定のビジネス機能を備えたプログラムを作成するために作成されたさまざまなシステム関数ライブラリと言語関数ライブラリを使用することです。アプリケーションです。たとえば、基本的なクローラー プログラムは Python 言語とリクエスト ライブラリを使用して完成させることができ、基本的な Web サイトは Java 言語と Java サーブレット ライブラリを使用して完成させることができます。
システム プログラミングとコールバックの関係システム プログラマは、アプリケーション プログラマが使用するために作成したライブラリ用のいくつかのインターフェイス、つまり API を残します。したがって、抽象化レイヤー図では、ライブラリはアプリケーションの下にあります。プログラムの実行中、通常の状況では、アプリケーションは API を通じてライブラリ内の事前に準備された関数を呼び出すことがよくあります。ただし、一部のライブラリ関数では、ターゲット タスクを完了する適切なタイミングで呼び出すことができるように、最初にアプリケーションに関数を渡す必要があります。渡されて後で呼び出されるこの関数は、
コールバック関数と呼ばれます。 テキストを読んで混乱している場合は、私が描いた図を見てください (以下の図 1):
コールバックを理解する前に、まず理解してください。同期呼び出し
同期呼び出しはブロッキング呼び出しであり、簡単に言うと上から下へ順番に実行されます。コールバックは非同期呼び出しシーケンスです。
同期呼び出しの具体的なケースとしては、古代の狼煙塔が考えられます。古代の万里の長城のビーコン送信メカニズムは同期呼び出しに似ており、各ビーコンは隣接するビーコンのステータスのみを確認でき、各ビーコンのステータスは明るい (点火状態) と暗い (点火していない状態) だけであると仮定します。 。
ビーコンタワーは A、B、C、D の 4 つあり、最初に A が点灯し、B は A のビーコンが点灯するのを見てすぐに点灯しに行きます。点灯するまでに 2 秒かかります。しかし、このときCビーコンの担当者は寝ていましたが、この時はみんなCが点灯するのを待っていて、最終的にCは2時間寝てBが点灯するのを見て、点灯しに行きました。 D が長期間点灯していないため、ビーコンに問題が発生しているため、プロセス全体が D が完了するのを待っています。 (これも考えさせられました。同期呼び出しはチェーンが失われやすい場合があります。前のステップでチェーンが失われると、次のステップ以降の操作が終了します。)
同期呼び出しのケースコード:
print("start.") print(123) print(456) a = 7 if a > 6: print(789) print(91011) print("end.")
一般的なシステムでは多くのライブラリが開発され、ライブラリには多くの関数が含まれます。一部の関数では、呼び出し元が必要に応じて呼び出される関数を作成する必要があります。これはライブラリの作成時に予測できず、呼び出し元によってのみ入力できるため、コールバック メカニズムが必要です。
コールバック メカニズムは、同期呼び出しメカニズムを改善するための方法であり、非同期呼び出しメカニズムは、同期呼び出しメカニズムを改善するためにも使用されます。 (このより重要な非同期については、後で記事を書きます)
コールバック関数が実際の問題をどのように解決するかの実例
コールバックは、次の方法で上記の問題を解決します。
#●● 関数をパラメータに変換可能● 柔軟でカスタマイズされた呼び出し方法 関数変数パラメータ casedef doubel(x): return 2*x def quadruple(x): return 4*x # mind function def getAddNumber(k, getEventNumber): return 1 + getEventNumber(k) def main(): k=1 i=getAddNumber(k,double) print(i) i=getAddNumber(k,quadruple) print(i) # call main main()
3 5
def call_you_phone(times): """ 叫醒方式: 给你打电话 :param times: 打几次电话 :return: None """ print('已经给旅客拨打了电话的次数:', str(times)) def knock_you_door(times): """ 叫醒方式: 去敲你房间门 :param times: 敲几次门 :return: None """ print('已经给旅客敲门的次数:', str(times)) def no_service(times): """ 叫醒方式: 无叫醒服务. (默认旅客是选无叫醒服务) :param times: 敲几次门 :return: None """ print('顾客选择无服务.不要打扰他的好梦。') def front_desk(times, function_name=no_service()): """ 这个相当于酒店的前台,你去酒店之后,你要啥叫醒方式都得在前台说 这里是实现回调函数的核心,相当于一个中转中心。 :param times:次数 :param function_name:回调函数名 :return:调用的函数结果 """ return function_name(times) if __name__ == '__main__': front_desk(100, call_you_phone) # 意味着给你打100次电话,把你叫醒
已经给旅客拨打了电话的次数:100
実用的なアプリケーション (Python のリクエスト ライブラリに付属するイベント フック)
このケースは簡単に解決できます。プログラムは同期メカニズムが実行されますが、フック イベントを通じて、以前のいくつかのステップを最初に実行できます。このフック イベントの原理は関数コールバックです。
import requests def env_hooks(response, *args, **kwargs): print(response.headers['Content-Type']) def main(): result = requests.get("https://api.github.com", hooks=dict(response=env_hooks)) print(result.text) if __name__ == '__main__': main()
application/json; charset=utf-8 {"current_user_url":"https://api.github.com/user","current_user_authorizations_html_url":"...省略"}
python チュートリアル
列から引用したものです。ぜひ学習してください。以上がPythonにおけるコールバックの意味を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。