我正在制作一个Messenger bot,我使用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...
Run Code Online (Sandbox Code Playgroud)
一个链接到环代码,其中这种意义上的行为是明确的,以及任何其他有关此问题的解释.
ama*_*loy 12
Ring问这个问题是错误的:ring不是http服务器,而是http服务器的抽象.ring本身没有固定的线程模型:它真正关心的是你有一个从请求到响应的功能.
真正做出这个决定的是你使用的环形适配器.到目前为止,最常见的是ring-jetty-adapter,它是一个jetty http处理程序,通过ring委托给你的函数.并且jetty确实为每个请求都有一个单独的线程,这样你就可以在一个线程中睡觉而不会影响其他线程(但正如另一个答案所述,线程不是免费的,所以你不想经常做这么多) .
但是还有其他环形处理程序具有不同的线程模型.例如,aleph包含一个基于netty的环形适配器,它在一个小的有限线程池中使用java.nio作为非阻塞IO; 在这种情况下,睡在"请求线程"上是非常具有破坏性的.
| 归档时间: |
|
| 查看次数: |
632 次 |
| 最近记录: |