Clojure“发送”和“发送”函数在向代理分派动作方面有啥区别?

Posted

技术标签:

【中文标题】Clojure“发送”和“发送”函数在向代理分派动作方面有啥区别?【英文标题】:What is the difference between Clojure's "send" and "send-off" functions with respect to dispatching an action to an agent?Clojure“发送”和“发送”函数在向代理分派动作方面有什么区别? 【发布时间】:2010-12-11 09:46:38 【问题描述】:

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

(send a f & args) - 向代理发送操作。立即返回代理。随后,在线程池中的一个线程中,代理的状态将被设置为:(apply action-fn state-of-agent args)

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

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

【问题讨论】:

【参考方案1】:

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

当您使用send-off 时,会为每个调用创建一个新线程。如果你 send-off 1000 个函数,那些不能立即处理的函数仍然等待下一个可用的处理器,但是如果 send-off threadpool 发生,它们可能会产生启动线程的额外开销要运行低。 如果线程阻塞也没关系,因为每个任务(可能)都有一个专用线程。

【讨论】:

send-off 并没有真正创建一个新线程,它使用了一个不同的、可扩展的线程池。 谢谢:我会编辑以包含它。感谢您指出这一点。 在我看来,如果您有足够的额外资源并且正在执行诸如 IO 之类有很多阻塞的事情,那么发送变体会很好,如果您正在做 CPU 密集型的事情,那么直接发送变体会更有效吗?

以上是关于Clojure“发送”和“发送”函数在向代理分派动作方面有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 在向 SQS 发送消息之前完成

在AWS lambda函数上使用pyspark二进制文件,在向驱动程序发送其端口号之前退出错误Java网关进程

推送:啥是socks5代理ip

如何在向服务器发送请求时添加设备信息?

如何以原子方式发送()缓冲区,以便它们不会被部分分派?

在向服务器发送请求时发生传输级错误。