【问题标题】:allocate thread per request clojure为每个请求分配线程
【发布时间】:2018-03-13 01:13:22
【问题描述】:

我迷失了所有这些异步/多线程库和原生 clojure 功能。

我有一个 Web 服务,它调用外部 API,转换它的响应,然后返回给客户端。现在是用 Python 编写的。我想让每个客户端在一个单独的线程中执行它的请求,这样他们就不会等待对方完成,或者服务器异步。不涉及繁重的计算,只等待IO。

我认为使用 clojure 会很容易,但我遗漏了一些东西...... Aleph 是异步服务器,对吧?但是,当我在请求处理程序内部模拟wait 时,整个服务器都在等待,而不仅仅是客户端。所以我不太明白这里异步的意义?

在我的理解中,这可能是错误的,异步服务器是否永远不会阻塞 IO 操作? sleep 可能是模拟等待 IO 的坏方法?

编辑我创建了一个从 Clojure 的 Aleph 服务器调用的哑等待服务,但请求处理仍然是连续的

(ns aleph-t.core
 ( :require [aleph.http :as http]
            [aleph.netty :as netty]))

(defn heavy [] (Thread/sleep 10000) "hello!")

(defn handler [req]
  {:status 200
   :headers {"content-type" "text/plain"}
   :body (heavy)})
; need to wait otherwise server is closed
(defn -main [& args]
  (netty/wait-for-close (http/start-server handler {:port 8080}))
  )

【问题讨论】:

    标签: multithreading asynchronous clojure aleph


    【解决方案1】:

    在编写异步后端时,您需要记住,您不能使用阻塞方法调用,因为它们会阻塞您的异步工作线程,从而阻塞您的整个后端。

    异步编程的基本思想是让您的工作线程主要执行真正的 CPU 工作,并为所有其他可能阻塞的操作使用回调(或通道、流或流形等)。这种方式异步编程可以为您的应用程序提供更高的吞吐量。

    在您的示例中,(Thread/sleep .) 阻塞了一个工作线程。

    将 aleph 用于 HTTP 时,您可以将 manifold 库用于异步 IO。

    有几个examples 将 aleph 与流形结合使用。 例如,您可以使用 core.async 超时来模拟长时间运行的任务,如 this example 所示。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      相关资源
      最近更新 更多