Подтвердить что ты не робот

В чем разница между функциями Clojure "send" и "send-off" в отношении отправки действия агенту?

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

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

и

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

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

4b9b3361

Ответ 1

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

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