26

Clojure APIは、これら2つの関数を次のように記述します。

(af&argsを送信)-アクションをエージェントにディスパッチします。すぐにエージェントを返します。その後、スレッドプールからのスレッドで、エージェントの状態は次の値に設定されます:(apply action-fn state-of-agent args)

(send-off af&args)-潜在的にブロックしているアクションをエージェントにディスパッチします。すぐにエージェントを返します。その後、別のスレッドで、エージェントの状態が次の値に設定されます:(apply action-fn state-of-agent args)

唯一の明らかな違いは、アクションがブロックされる可能性がある場合に見送りを使用する必要があることです。誰かがこの機能の違いをより詳細に説明できますか?

4

1 に答える 1

28

を使用してエージェントに送信されるすべてのアクションはsend、プロセッサの物理的な数よりも2、3多いスレッドを持つスレッドプールで実行されます。これにより、CPUの全容量に近づきます。を使用して1000回の呼び出しを行う場合send、スイッチングオーバーヘッドはそれほど発生しません。すぐに処理できない呼び出しは、プロセッサが使用可能になるまで待つだけです。それらがブロックすると、スレッドプールが枯渇する可能性があります。

を使用するsend-offと、呼び出しごとに新しいスレッドが作成されます。1000個の関数を使用している場合、すぐに処理できない関数は、次に使用可能なプロセッサを待機しますが、送信send-offスレッドプールが不足している場合は、スレッドを開始するための余分なオーバーヘッドが発生する可能性があります。各タスクは(潜在的に)専用のスレッドを取得するため、スレッドがブロックされても問題ありません。

于 2009-10-29T22:12:00.757 に答える