我对所有这些异步/多线程lib和本地clojure功能感到迷茫。
我有一个Web服务,它调用外部API,转换它响应,然后回馈给客户端。现在是用Python编写的。我想让每个客户端在单独的线程中执行其请求,这样它们就不会等待彼此完成,或者服务器是异步的。不涉及繁重的计算,只需等待IO。
我原以为使用clojure会很容易,但是我忽略了一些东西...Aleph是异步服务器吧?然而,当我在请求处理程序中模拟一个< code>wait时,整个服务器都在等待,而不仅仅是客户端。所以我不太明白异步有什么意义?
在我的理解中,可能是错误的,异步服务器从不为IO操作阻塞?可能< code>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}))
)
在编写异步后端时,您需要记住,您不能使用阻塞方法调用,因为它们会阻塞您的异步工作线程,从而阻塞您的整个后端。
异步编程的基本思想是让你的工作线程主要执行真正的CPU工作,并对所有其他潜在的阻塞操作使用回调(或通道,流或流形等)。通过这种方式,异步编程可以为应用程序提供更高的吞吐量。
在您的示例中,< code >(线程/睡眠。)阻塞一个工作线程。
使用aleph for HTTP时,可以使用流形库进行异步IO。
有一些将alef与流形一起使用的示例。例如,您可以使用core.async超时来模拟长时间运行的任务,如本例所示。
但是堆栈创建是如何工作的呢?Java是否在创建每个线程时为其创建堆栈?如果是,堆栈在内存上的具体位置?它当然不在“托管”堆中。 JVM是从本机内存创建堆栈还是为堆栈预先分配了一段托管内存区域?如果是,那么JVM如何知道如何创建线程呢?
问题内容: 您能否解释一下已经在各种servlet实现中实现的两种方法: 每个连接线程 每个请求的线程 以上两种策略中的哪一种可以更好地扩展,为什么? 问题答案: 以上两种策略中的哪一种可以更好地扩展,为什么? 每个请求线程的可伸缩性比每个连接线程的可伸缩性更好。 Java线程非常昂贵,通常每个线程都使用1Mb的内存段,无论它们是活动的还是空闲的。如果为每个连接提供自己的线程,则该线程通常在连接的
我尝试分析一个gRPC java服务器。我主要看到下面的一组线程池。 null
为什么这是一个好主意呢?您通过使用这种方法获得了什么好处?在某些情况下,这会是一个好主意吗?在每个存储库方法调用实例化时,您是否可以使用这种技术做一些不能做的事情?
为什么首先这是一个好主意?通过使用这种方法,您获得了哪些优势?在某些情况下,这是一个好主意吗?在每个存储库方法调用实例化s时,使用此技术是否可以执行一些不能执行的操作?
我只是想了解如何在Java中编写一个每请求线程的TCP服务器。我已经编写了一个每连接线程的服务器,它运行serverSocket.accept()并在每次新连接进入时创建一个新线程。 如何将其修改为每请求线程服务器?我想传入的连接可以放入某种队列中,但是您如何知道哪个连接发出了请求&准备好了服务呢? 我怀疑NIO在这里是必要的,但不确定。 多谢了。 [编辑] 明确一点--原来的“服务器”只是我编写