我知道,您可以显式地使用java.util.concurrent.Executors中的工具和诸如代理和原子之类的语言构造来构建多线程Clojure程序。然而,如果我编写了一个环形应用程序,多线程服务器(比如Jetty或Immutant)将如何改变它的运行方式?如果我在开始处理请求之前进行了一些初始化(例如加载配置、设置数据库连接池),那么我最终会在不同的线程中完成重复的、可能不一致的工作吗?每个请求会由一个线程处理吗?
发布于 2017-03-14 03:23:15
在web请求到达之前,Clojure代码将休眠任何线程(本质上是在编写库/子例程,而不是主程序)。Jetty等人将分配一个线程来调用Clojure代码,并提供相关参数。如果您发出任何DB请求,它们通常会通过套接字输出到DB机器,这将分配一个线程来处理您的请求并返回相关的结果。Jetty中的线程将从DB接收数据,并从那里继续处理。
重要的是,每一条信息都被视为一条不可变的信息。消息可以在不失去意义的情况下从一个系统复制和传递到另一个系统。不管有多少拷贝被复制和删除,只有一个拷贝到达最终目的地。
一个简单的webapp通常不需要自己进行任何多线程处理,因为Jetty和DB提供的线程处理和同步通常都是所需的。如果您为某件事情执行自己的多线程处理,则通常只需担心您自己的内部同步。
您可以在网上看到一些好的信息,在克洛尔烹饪书上。。
我也可以强烈推荐这本书使用Clojure开发Web。
https://stackoverflow.com/questions/42776343
复制相似问题