В чем разница между функциями Clojure для отправки и отправки в отношении отправки действия агенту? - PullRequest
25 голосов
/ 29 октября 2009

Clojure API описывает эти две функции как:

(отправить е & args) - отправить действие агенту. Возвращает агента немедленно. Впоследствии в потоке из пула потоков состояние агента будет установлено равным значению: (применить аргументы action-fn state-of-agent)

и

(отослать f & args) - отправить потенциально блокирующее действие агенту. Возвращает агента немедленно. Впоследствии в отдельном потоке для состояния агента будет установлено значение: (применить аргументы action-fn state-of-agent)

Единственное очевидное отличие состоит в том, что отправление следует использовать, когда действие может блокироваться. Может кто-нибудь объяснить эту разницу в функциональности более подробно?

1 Ответ

26 голосов
/ 30 октября 2009

все действия, отправляемые любому агенту с помощью send, выполняются в пуле потоков с парой потоков, превышающей физическое число процессоров. это заставляет их работать ближе к полной мощности процессора. если вы делаете 1000 звонков, используя send, то на самом деле вы не тратите много времени на переключение, вызовы, которые не могут быть обработаны немедленно, просто ждут, пока процессор не станет доступным. если они блокируются, то пул потоков может работать всухую.

когда вы используете send-off, новый поток создается для каждого вызова. если вы send-off 1000 функций, те, которые не могут быть обработаны немедленно, все еще ждут следующего доступного процессора, но они могут повлечь дополнительные издержки при запуске потока, если пул потоков отправки произойдет быть на исходе. нормально, если потоки блокируют , потому что каждая задача (потенциально) получает выделенный поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...