每个请求clojure分配线程

时间:2017-10-01 22:27:38

标签: multithreading asynchronous clojure aleph

我迷失了所有这些异步/多线程库和本机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}))
  )

1 个答案:

答案 0 :(得分:3)

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

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

在您的示例中,(Thread/sleep .)会阻止工作线程。

使用aleph for HTTP时,可以使用manifold库进行异步IO。

有一些examples使用aleph与多种方式。 例如,您可以使用core.async超时来模拟this example中所见的长时间运行的任务。

相关问题