多线程 Web 服务器如何影响 Clojure 程序?

How does a multi-threaded web server affect a Clojure program?

我知道您可以使用 java.util.concurrent.Executors 中的工具和代理和原子等语言结构显式构建多线程 Clojure 程序。但是,如果我编写一个 Ring 应用程序,多线程服务器(如 Jetty 或 Immutant)将如何改变它的运行方式?如果我在开始处理请求之前进行一些初始化(例如加载配置、设置数据库连接池),我是否会在不同的线程中进行重复的、可能不一致的工作?每个请求是否由一个线程处理?

您的 Clojure 代码将处于休眠状态 w/o 任何线程,直到 Web 请求到达(本质上您正在编写 library/subroutine,而不是主程序)。 Jetty et al 将分配一个线程来调用您的 Clojure 代码,并提供相关参数。如果您发出任何数据库请求,它们通常会通过套接字发送到数据库机器,这将分配一个线程来处理您的请求和 return 相关结果。 Jetty 中的线程将从数据库接收数据并从那里继续处理。

重要的是,每条信息都被视为不可变消息。消息可以从一个系统复制并传递到另一个系统而不会失去其意义。制作和删除多少副本无关紧要,只有一份到达最终目的地。

一个简单的网络应用程序通常不需要自己进行任何多线程处理,因为通常只需要 Jetty 和数据库提供的线程处理和同步。如果你为某事做自己的多线程,你主要只需要担心你自己的内部同步。

网上可以看到一些不错的资料at The Clojure Cookbook.

我也强烈推荐这本书Web Development with Clojure.