Clojure API将这两个函数描述为:
(发送f& args) - 向代理发送动作。立即返回代理。随后,在来自线程池的线程中,代理的状态将设置为以下值:(应用action-fn state-of-agent args)
和
(发送f& args) - 向代理发送可能阻止的操作。立即返回代理。随后,在单独的线程中,代理的状态将设置为以下值:(应用action-fn state-of-agent args)
唯一明显的区别是,当某个操作可能会阻止时,应使用 send-off 。有人可以更详细地解释这种功能差异吗?
答案 0 :(得分:25)
使用send
发送给任何代理的所有操作都在一个线程池中运行,该线程池的线程数比物理数量的处理器多。这导致他们更接近cpu的全部容量。如果使用send
进行1000次呼叫,则实际上不会产生很多切换开销,无法立即处理的呼叫只会等待处理器可用。 如果它们阻塞,那么线程池就会枯竭。
当您使用send-off
时,会为每个调用创建一个新线程。如果您send-off
1000个函数,那些无法立即处理的函数仍然等待下一个可用的处理器,但如果发送线程池碰巧正在低迷。 如果线程阻塞则没问题,因为每个任务(可能)都会获得一个专用线程。