エージェントへのアクションのディスパッチに関して、Clojureの「送信」機能と「送信」機能の違いは何ですか?

StackOverflow https://stackoverflow.com/questions/1646351

  •  22-07-2019
  •  | 
  •  

質問

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 が少なくなっています。 各タスクが(潜在的に)専用のスレッドを取得するため、スレッドがブロックされても問題ありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top