2

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

4

1 回答 1

3

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

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

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

您可以在 Clojure Cookbook在线查看一些很好的信息。

我还强烈推荐使用 Clojure 进行 Web 开发这本书。

于 2017-03-14T03:23:15.280 回答