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

时间:2017-03-14 01:34:25

标签: java multithreading clojure immutant

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

1 个答案:

答案 0 :(得分:3)

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

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

一个简单的webapp通常不需要对它自己进行任何多线程处理,因为线程处理& Jetty和DB提供的同步通常都是需要的。如果您为某些事情进行自己的多线程处理,那么您大多只需要担心自己的内部同步。

您可以在线查看一些有用的信息at The Clojure Cookbook.

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