我知道您可以使用 java.util.concurrent.Executors 中的工具以及代理和原子等语言结构显式构建多线程 Clojure 程序。但是,如果我编写一个 Ring 应用程序,多线程服务器(如 Jetty 或 Immutant)将如何改变它的运行方式?如果我在开始服务请求之前进行一些初始化(例如加载配置、设置数据库连接池),我最终会在不同线程中进行重复的、可能不一致的工作吗?每个请求都会由一个线程处理吗?
最佳答案
您的 Clojure 代码将处于 hibernate 状态,无需任何线程,直到 Web 请求到达为止(本质上您正在编写库/子例程,而不是主程序)。 Jetty 等人将分配一个线程来调用您的 Clojure 代码,并提供相关参数。如果您发出任何数据库请求,它们通常会通过套接字发送到数据库计算机,数据库计算机将分配一个线程来处理您的请求并返回相关结果。 Jetty 中的线程将从数据库接收数据并从那里继续处理。
重要的是,每条信息都被视为一条不可变的消息。消息可以从一个系统复制并传递到另一个系统,而不会失去其含义。制作和删除多少份副本并不重要,重要的是一份副本到达最终目的地。
一个简单的 Web 应用程序通常不需要自己执行任何多线程处理,因为 Jetty 和数据库提供的线程处理和同步通常就足够了。如果您为某些事情使用自己的多线程,那么您通常只需要担心自己的内部同步。
网上可以看到一些不错的信息at The Clojure Cookbook.
我也强烈推荐这本书Web Development with Clojure.
关于java - 多线程 Web 服务器如何影响 Clojure 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42776343/