如何在 Clojure 中处理并发用户请求?
How to process concurrent user requests in Clojure?
我是 Clojure 的初学者,我对如何在 Web 应用程序中处理并发用户请求很感兴趣。作为一名 node.js 开发者,我使用事件循环 (promises/callback/async-await) 访问数据库来处理并发用户请求,这意味着主线程不会被阻塞,我可以处理其他用户的请求而无需等待数据库响应。如果我向数据库发出请求,我如何在 Clojure 中处理并发用户请求,这意味着我的线程将被阻塞并且我无法处理任何其他用户请求?我应该为每个用户创建一个新线程来处理请求吗?我知道我可以在 Clojure 中使用 futures 来创建一个新线程,但是我如何使用它来创建一个对 DB 的请求,如果创建一个新线程,我的主线程将被阻塞以等待请求数据库的子线程?我不明白期货如何在这种情况下帮助我。最佳实践是什么,或者像 Jetty 这样的服务器可以提供更好的开箱即用处理?如果你能在这件事上帮助我,我将不胜感激。
简短的回答是,典型的 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 网络服务器(即线程池)中现有的并发特性通常足以处理数百个并发请求。
最著名的 Clojure 异步库是 core.async
, manifold
, promesa
and more recently missionary
。
我是 Clojure 的初学者,我对如何在 Web 应用程序中处理并发用户请求很感兴趣。作为一名 node.js 开发者,我使用事件循环 (promises/callback/async-await) 访问数据库来处理并发用户请求,这意味着主线程不会被阻塞,我可以处理其他用户的请求而无需等待数据库响应。如果我向数据库发出请求,我如何在 Clojure 中处理并发用户请求,这意味着我的线程将被阻塞并且我无法处理任何其他用户请求?我应该为每个用户创建一个新线程来处理请求吗?我知道我可以在 Clojure 中使用 futures 来创建一个新线程,但是我如何使用它来创建一个对 DB 的请求,如果创建一个新线程,我的主线程将被阻塞以等待请求数据库的子线程?我不明白期货如何在这种情况下帮助我。最佳实践是什么,或者像 Jetty 这样的服务器可以提供更好的开箱即用处理?如果你能在这件事上帮助我,我将不胜感激。
简短的回答是,典型的 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 网络服务器(即线程池)中现有的并发特性通常足以处理数百个并发请求。
最著名的 Clojure 异步库是 core.async
, manifold
, promesa
and more recently missionary
。