我迷失了所有这些异步/多线程库和本机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}))
)
答案 0 :(得分:3)
编写异步后端时,需要记住,不能使用阻塞方法调用,因为这些会阻塞异步工作线程,从而阻塞整个后端。
异步编程的基本思想是让您的工作线程主要执行真正的CPU工作,并使用回调(或通道或流或流形等)来执行其他所有可能的阻塞操作。这样异步编程可以为您的应用程序提供更高的吞吐量。
在您的示例中,(Thread/sleep .)
会阻止工作线程。
使用aleph for HTTP时,可以使用manifold库进行异步IO。
有一些examples使用aleph与多种方式。 例如,您可以使用core.async超时来模拟this example中所见的长时间运行的任务。