26

Clojure API 将这两个函数描述为:

(send af & args) - 向代理发送动作。立即返回代理。随后,在来自线程池的线程中,代理的状态将设置为以下值:(应用 action-fn state-of-agent args)

(send-off af & args) - 向代理发送一个潜在的阻塞动作。立即返回代理。随后,在单独的线程中,代理的状态将设置为:(应用 action-fn state-of-agent args)

唯一明显的区别是当一个动作可能阻塞时应该使用发送。有人可以更详细地解释这种功能差异吗?

4

1 回答 1

28

发送到任何代理的所有操作send都在线程池中运行,线程池的线程数比处理器的物理数量多。这使它们运行得更接近 CPU 的全部容量。如果您使用 1000 次调用send并不会产生太多的切换开销,那么无法立即处理的调用只需等待处理器可用。如果它们阻塞,那么线程池可能会干涸。

当您使用 时send-off,会为每个调用创建一个新线程。如果你有send-off1000 个函数,那些不能立即处理的函数仍然等待下一个可用的处理器,但是如果发送线程池恰好运行不足,它们可能会导致启动线程的额外开销。如果线程阻塞是可以的,因为每个任务(可能)都有一个专用线程。

于 2009-10-29T22:12:00.757 回答