首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure是否为每个请求创建一个线程?

Clojure是否为每个请求创建一个线程?
EN

Stack Overflow用户
提问于 2017-07-05 18:34:37
回答 2查看 1.3K关注 0票数 7

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

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

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

代码语言:javascript
复制
  (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...

链接到环代码,其中的行为在这个意义上是明确的,将不胜感激,以及任何其他与这一问题的解释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-05 21:52:51

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

真正决定这个决定的是您使用哪个环适配器。到目前为止,最常见的是ring - jetty适配器,它是一个jetty处理程序,它通过ring将您的函数委托给您。对于每个请求,jetty确实只有一个线程,这样您就可以在一个线程中睡眠而不会影响其他线程(但正如另一个答案所指出的,线程并不是免费的,因此您不希望经常这样做)。

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

票数 16
EN

Stack Overflow用户

发布于 2017-07-05 19:27:01

假设您是在讨论处理程序中的代码,环网中的Thread/sleep确实会使请求线程休眠。如果您有多个请求,则会烧掉昂贵的服务器线程。

环形块的原因是(非异步)模型基于函数组合,其中一个函数的结果是另一个函数的输出。所以他们必须等待,在我不知道的代码中,我能准确地找到这个。

把它放在一个go块中会更好,因为这样您就不会阻塞服务器线程。它可以在发送消息时返回响应。请注意,您不能使用go块的结果。

如果您还希望异步地响应(而不阻塞服务器线程),则可以使用基座

对于大多数服务器来说,同步处理程序就足够了,但是如果您正在使用线程/休眠并希望得到响应,我建议您使用异步循环处理程序、基座或其他框架。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44933614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档