【问题标题】:How to process concurrent user requests in Clojure? [closed]如何在 Clojure 中处理并发用户请求? [关闭]
【发布时间】:2021-08-23 15:48:07
【问题描述】:

我是 Clojure 的初学者,我对如何在 Web 应用程序中处理并发用户请求感兴趣。作为一个 node.js 开发者,我使用事件循环(promises/callback/async-await)来访问数据库来处理并发用户请求,这意味着主线程不会被阻塞,我可以处理其他用户的请求而无需等待数据库响应。如果我向数据库发出请求,我如何在 Clojure 中处理并发用户请求,这意味着我的线程将被阻止并且我无法处理任何其他用户请求?我应该为每个用户创建一个新线程来处理请求吗?我知道我可以在 Clojure 中使用期货来创建一个新线程,但是我如何使用它,例如对 DB 的一个请求,如果创建一个新线程,我的主线程将被阻塞以等待请求数据库的子线程?我不明白在这种情况下期货如何帮助我。最佳实践是什么,或者像 Jetty 这样的服务器可以提供更好的开箱即用处理?如果您能在这件事上帮助我,我将不胜感激。

【问题讨论】:

  • 这太宽泛了。选择一个要问的问题。
  • 我理解这个问题是关于在 Clojure Web 应用程序中处理用户请求的并发,而不是效率。通过对问题标题和文本进行一些改写,这可以更清楚。

标签: multithreading asynchronous web clojure


【解决方案1】:

简短的回答是,典型的 Java Web 服务器在其实现中使用许多线程,其中一些被分配给应用程序代码在处理请求时使用。在任何时刻,可能有几个用户请求正在进行中。通常有一个专用于应用程序代码的应用程序线程池,由 Web 服务器管理。

作为 Clojure 应用程序开发人员,没有什么可以利用应用程序线程池。您无需编写代码来分配新线程。您的 Web 应用程序将在 Web 服务器管理的不同线程中自动处理并发用户请求。可能有一些配置可用,具体取决于您使用的 Web 服务器库。例如,ring-jetty-adapter 具有 options to control the number of threads in the thread pool

有可用的 Clojure 库支持异步处理,作为 node.js 开发人员,您会非常熟悉这种模型。不过老实说,异步并不是初学者应该使用的第一个工具,因为充分利用 Java Web 服务器(即线程池)中现有的并发特性通常足以处理数百个并发请求。

最著名的 Clojure 异步库是 core.asyncmanifoldpromesa 和最近的 missionary

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多