gpt4 book ai didi

clojure - Clojure Ring 是否为每个请求创建一个线程?

转载 作者:行者123 更新时间:2023-12-03 00:30:35 24 4
gpt4 key购买 nike

我正在制作一个 Messenger 机器人,并使用 Ring 作为我的 http 框架。

有时我想在机器人发送的消息之间应用延迟。我的期望是使用 Thread/sleep 是安全的,因为这将使事件线程休眠,而不是整个服务器休眠。是这样吗,还是我应该求助于 clojure/core.async

这是我在没有async的情况下编写的代码:

  (match [reply]

; The bot wants to send a message (text, images, videos etc.) after n milliseconds
[{:message message :delay delay}]
(do
(Thread/sleep interval delay)
(facebook/send-message sender-id message))
; More code would follow...

如果能提供 Ring 代码的链接(在这种意义上其行为是清晰的),以及任何其他对此问题有解释的链接,我们将不胜感激。

最佳答案

问这个问题是错误的:ring 不是一个 http 服务器,而是对 http 服务器的抽象。 Ring本身没有固定的线程模型:它真正关心的是你有一个从请求到响应的函数。

真正做出这个决定的是您使用哪种环形适配器。到目前为止,最常见的是ring-jetty-adapter,它是一个jetty http处理程序,通过ring委托(delegate)给你的函数。而且jetty确实为每个请求都有一个线程,这样你就可以在一个线程中休眠而不影响其他线程(但正如另一个答案中所述,线程不是免费的,所以你不想定期做大量的事情) .

但是还有其他具有不同线程模型的环处理程序。例如,aleph 包括一个基于 netty 的环适配器,它使用 java.nio 在小型、有限的线程池中进行非阻塞 IO;在这种情况下,在“请求线程”上休眠是非常具有破坏性的。

关于clojure - Clojure Ring 是否为每个请求创建一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com