コールバック関数:ポインタ(アドレス)関数は、ポインタが、それが指す関数を呼び出すために使用されたとき、私たちは、これがコールバック関数であると言う、別の関数にパラメータとして渡されます。コールバック関数は、関数を達成するために、当事者から直接呼び出されるが、別の発呼者特定のイベントまたは状態がイベントまたは条件に応答するために、発生したときにされていません。
人気が理解される他の関数への関数の引数として、第一の機能は、コールバック関数と呼ばれています:。これは、渡された引数が実際に(アドレス)の関数へのポインタである関数ポインタ、です。
同期呼び出し、コールバックと非同期呼び出し:ソフトウェアモジュール間のインタフェースの特定の量は、呼び出しから、私たちは、次の3つのカテゴリにそれらを置くことができ、常にあります。
- 同期呼び出しは、一方向の呼び出しで、返す前に終了したブロッキング呼び出し、他の側を待つために、発信者です。
- コールバックは、インターフェイスが呼び出されたときに、呼び出し側はインターフェースの反対側を呼び出すで双方向通話モード、です。
- 非同期呼び出しは、メッセージのメカニズムまたは同様のイベントですが、それはクライアント側でクライアント側(コール・インタフェースを通知するためにイニシアチブを取るのコールのちょうど反対の方向、特定のメッセージまたは特定のイベント発生の受信時にサービス・インターフェース、です。
コールバックと非同期呼び出しの関係が非常に近く、私たちは通常、非同期コールバックメッセージ登録通知メッセージは、非同期呼び出しによって実装される実装に使用されます。同期呼び出しは、3の最も簡単なの一つですが、彼らは多くの場合、基礎のコールバック、非同期呼び出しなので、のは、異なるソフトウェアアーキテクチャにおけるコールバックメカニズムの実現に焦点を当ててみましょう
ランダムAS RDインポート #呼び出し先----------- ---------------------------- DEF newRN( FN):0,1)小数の間で発生する#10 NS = [] :範囲(10)内のIための N- = ROUND(rd.random()、2) ns.append(N-) 直接リターン無し#呼び出し側は、通知リターン結果受信しないので、 コールバック関数の方法に変更する#を FN(NS)#呼び出しは、呼び出し元関数であり、この操作はコールバックと呼ばれる #----------------コールを牙------------------------ #コールバック関数を定義する DEFのABC(*引数を): #は、この関数に入力し、呼び出し元関数があることを意味します実行 プリント(「成功は、データを生成する」) 印刷(引数) newRN(ABC)
ケースII
インポートランダムAS RD インポート時間 DEFテスト(FN、N): "" " テスト生成時刻n(秒)が必要乱数 :PARAMのFn:コールバック関数 :PARAM nは世代数 :リターン: " "" START_TIME = time.time()#開始時刻 :レンジ(N-)でiに対する rd.random() CPUがスリープ状態にできるようにするtime.sleep(0.1)#0.1秒 のサイクルタイムのEND_TIME = time.time()#エンド 秒=ラウンドを(END_TIME - START_TIME)#実行時間 FN(秒、N)#(秒)、nは生成された数のバック転送するとき DEFのtest_callback(tm_s、N-): 印刷({1}、Sを使用する場合、{0}の数を生成します」。フォーマット(N、tm_s)) 試験(test_callback、20です)
ケースIII
DEF findNumbers(パス、NUM、FN): L = [] ROWNO = 1 開く(パス、R '+')Fとして: :f.readlines()内のラインの インデックス= line.find(STR(NUM)) ならインデックス= -1: l.append((ROWNO、指数+ 1)) ROWNO + = 1つの FN(L) DEF callback_(SL): プリント(SL) findNumbers( '222.txt'、5、callback_)