web-dev-qa-db-ja.com

並列Python:コールバックとは何ですか?

Parallel Python には何かがあります 参加する と呼ばれる関数 callback ( documentation )しかし、あまり説明が上手くないようです。数日前に彼らのフォーラムに投稿しましたが、返事はありません。誰かがコールバックとは何か、それが何のために使われているのか説明してもらえますか?

ありがとうございました。

41
Nope

コールバックは、APIのコンシューマーが提供する関数であり、APIが向きを変えて呼び出す(コールバックする)ことができます。 Dr.の予約を設定したら、電話番号を教えて、前日に電話して予約を確認することができます。コールバックはそのようなものですが、電話番号だけでなく、「このアドレスにメールを送信して、秘書に電話してカレンダーに入れてもらう」などの任意の指示を使用できます。

コールバックは、アクションが非同期の状況でよく使用されます。関数を呼び出してすぐに作業を続ける必要がある場合は、その戻り値を待って何が起きたかを知らせることができないため、コールバックを提供します。関数が完全に非同期作業を完了すると、いくつかの所定の引数(通常は指定した引数、および要求した非同期アクションのステータスと結果に関する引数)でコールバックを呼び出します。

博士が不在であるか、または彼らがまだスケジュールに取り組んでいる場合、数時間かかる可能性がある彼が戻ってくるまで待機するのではなく、私たちは電話を切り、予定がスケジュールされたら、彼らは電話してね。

この特定のケースでは、Parallel Pythonのsubmit関数は、funcの実行が終了すると、指定した引数とfuncの結果でコールバックを呼び出します。

159
Logan Capaldo

ドキュメントの関連箇所:

callback - callback function which will be called with argument 
        list equal to callbackargs+(result,) 
        as soon as calculation is done
callbackargs - additional arguments for callback function

そのため、結果の準備ができたらすぐにコードを実行したい場合は、そのコードを関数に入れて、その関数をcallback引数として渡します。他の引数が必要ない場合は、例えば:

def itsdone(result):
  print "Done! result=%r" % (result,)
...
submit(..., callback=itsdone)

Pythonのcallbackパターンの詳細については、例えば私のプレゼンテーション ここ

18
Alex Martelli

リンクを見ると、呼び出されるフックのように見えます。

callback-計算が完了するとすぐにcallbackargs +(result、)に等しい引数リストで呼び出されるコールバック関数

「計算が完了するとすぐに」ビットはあいまいに見えます。ポイントは、このことからわかる限り、submit()呼び出しは他のサーバーに作業を分散してから戻るということです。仕上げはブロックではなく非同期であるため、作業単位が終了したときに呼び出される関数を提供できます。もしあなたがそうするなら:

_submit( ..., callback=work_finished, ... )
_

次に、submitは、ターゲットサーバーで分散作業ユニットが完了すると、work_finished()が呼び出されるようにします。

submit()を呼び出すとき、callbackを指定できます。これは、submit() ...の呼び出し元と同じランタイムで呼び出され、配布後に呼び出されますワークロード機能の完了。

「submit()で何かをしたときにfoo(x、y)を呼び出す」ようなもの

しかし、いや、ドキュメントの方が良いかもしれません。 ppythonソースを見て、submit()でコールバックが呼び出されるポイントを確認します

4
Aiden Bell

コールバック は、後で呼び出す関数によって呼び出される、定義する関数です。

例として、AJAXの仕組みを検討してください。バックエンドサーバー関数を呼び出すコードを記述します。将来のある時点で、その関数から返されます( "A"はAsynchronousこれは、「Parallel Python」の「Parallel」のすべてです)。今度は、コードがサーバー上のコードを呼び出すので、完了したときにそれを知らせて、その結果を使って何かをしたいのです。これは、コールバック関数を呼び出すことで行います。

呼び出された関数が完了すると、それが完了したことを知らせる標準的な方法は、コード内の関数を呼び出すように指示することです。これがコールバック関数であり、その仕事は、呼び出した下位レベル関数からの結果/出力を処理することです。

3
Jeremy Smyth

コールバックは単なる関数です。 Pythonでは、関数は単なるオブジェクトであるため、関数の名前は変数のように使用できます。

def func():
    ...

something(func)

引数としてコールバックを受け入れる多くの関数では、通常、コールバックが特定の引数を受け入れる必要があることに注意してください。この場合、コールバック関数は、callbackargsで指定された引数のリストを受け入れる必要があります。私はParallel Pythonに精通していないので、私はそれが何を望んでいるか正確に知りません。

1
marsolk