エージェントへのアクションのディスパッチに関して、Clojureの「送信」機能と「送信」機能の違いは何ですか?
質問
Clojure APIは、これら2つの関数を次のように記述しています:
(f& argsを送信)-アクションをエージェントにディスパッチします。エージェントをすぐに返します。続いて、スレッドプールのスレッドで、エージェントの状態が次の値に設定されます:(apply action-fn state-of-agent args)
and
(send-off a f& args)-ブロックする可能性のあるアクションをエージェントにディスパッチします。エージェントをすぐに返します。その後、別のスレッドで、エージェントの状態が次の値に設定されます:(action-fn state-of-agent argsを適用)
唯一の明らかな違いは、アクションがブロックする可能性がある場合に、送信を使用する必要があることです。誰かがこの機能の違いを詳細に説明できますか?
解決
send
を使用してエージェントに送信されるすべてのアクションは、物理的なプロセッサー数よりも多くのスレッドを持つスレッドプールで実行されます。これにより、CPUの最大容量に近づくように実行されます。 send
を使用して1000回の呼び出しを行う場合、実際には多くのスイッチングオーバーヘッドは発生しません。すぐに処理できない呼び出しは、プロセッサが使用可能になるまで待機するだけです。 ブロックされた場合、スレッドプールは空になります。
send-off
を使用すると、呼び出しごとに新しいスレッドが作成されます。 1000個の関数を send-off
すると、すぐに処理できない関数は次の利用可能なプロセッサーを待機しますが、 send- off threadpool が少なくなっています。 各タスクが(潜在的に)専用のスレッドを取得するため、スレッドがブロックされても問題ありません。