何时在 Clojure Web 应用程序中创建多个线程?

When are multiple threads created in Clojure web app?

我正在使用 luminus 和 ring 在 Clojure 中构建 Web 应用程序。我使用 lein uberjar 构建我的应用程序,然后使用 undertow 服务器构建它。

我的问题是,何时在单独的非阻塞线程中对应用程序发出请求 运行?

我已经通过向执行 (Thread/sleep 20000) 的页面发出请求来测试应用程序的并发性。如果我在 Chrome 中的两个选项卡中同时访问此页面,则在第一个选项卡加载后约 20 秒后才会加载第二个选项卡。因此,这两个访问似乎并没有创建不同的线程。

但是,如果我在一个 Chrome 选项卡和一个 Safari 选项卡中访问页面,两个选项卡会同时完成。如果我使用两个 Safari 选项卡,它们会同时完成。

这是如何工作的? undertow 何时为每个请求创建单独的线程?

编辑:此行为与 Undertow 或 Clojure 无关,而是 Chrome,正如@Piotrek Bzdyl 所指出的。请参阅下面的评论。

我认为您正在观察 Chrome 行为 - 它在整个 Chrome 应用程序中打开到给定 URL 的单个连接 - 如果您打开相同的 URL在不同的选项卡中,Chrome 将首先在一个选项卡中打开并下载资源,完成后将在另一个选项卡中进行同样的操作。

要在您的应用程序中测试并发性,您需要使用其他工具。您可以尝试 运行 多个 curl 命令或更好的 ab 工具:

ab -c 3 -n 3 https://www.google.com/