В чем разница между & # 8220; send & # 8221; Clojure; и & # 8220; отправка & # 8221; функции в отношении отправки действия агенту?

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

  •  22-07-2019
  •  | 
  •  

Вопрос

API Clojure описывает эти две функции следующим образом:

  

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

и

  

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

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top