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

标签 java multithreading clojure immutant

我知道您可以使用 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/

相关文章:

clojure - Clojure 中的简单二维数组

java - 在 Yosemite OSX 的 Safari 中显示 JPG 的问题

java - 如何使2个不相关的实体(两个存储库)同时在一个项目中运行?是否可以?

java - 用递归方法记录标记节点的数量

c++ - qt类中的线程

python - Python 中的快速方法调用调度

clojure - 为什么我的 clojure.core.logic 非成员函数返回两个值?

java - 如何在apache cxf中的soap header 和Web服务方法之间共享数据

java - 为什么Android线程在完成执行之前就被终止了?

clojure - 为什么字符串格式化会导致转换异常?