当前位置: 首页 > 知识库问答 >
问题:

为clojure中的每个请求分配线程

方昊
2023-03-14

我对所有这些异步/多线程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}))
  )

共有1个答案

卫建义
2023-03-14

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

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

在您的示例中,< code >(线程/睡眠。)阻塞一个工作线程。

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

有一些将alef与流形一起使用的示例。例如,您可以使用core.async超时来模拟长时间运行的任务,如本例所示。

 类似资料:
  • 但是堆栈创建是如何工作的呢?Java是否在创建每个线程时为其创建堆栈?如果是,堆栈在内存上的具体位置?它当然不在“托管”堆中。 JVM是从本机内存创建堆栈还是为堆栈预先分配了一段托管内存区域?如果是,那么JVM如何知道如何创建线程呢?

  • 问题内容: 您能否解释一下已经在各种servlet实现中实现的两种方法: 每个连接线程 每个请求的线程 以上两种策略中的哪一种可以更好地扩展,为什么? 问题答案: 以上两种策略中的哪一种可以更好地扩展,为什么? 每个请求线程的可伸缩性比每个连接线程的可伸缩性更好。 Java线程非常昂贵,通常每个线程都使用1Mb的内存段,无论它们是活动的还是空闲的。如果为每个连接提供自己的线程,则该线程通常在连接的

  • 我尝试分析一个gRPC java服务器。我主要看到下面的一组线程池。 null

  • 为什么这是一个好主意呢?您通过使用这种方法获得了什么好处?在某些情况下,这会是一个好主意吗?在每个存储库方法调用实例化时,您是否可以使用这种技术做一些不能做的事情?

  • 为什么首先这是一个好主意?通过使用这种方法,您获得了哪些优势?在某些情况下,这是一个好主意吗?在每个存储库方法调用实例化s时,使用此技术是否可以执行一些不能执行的操作?

  • 我只是想了解如何在Java中编写一个每请求线程的TCP服务器。我已经编写了一个每连接线程的服务器,它运行serverSocket.accept()并在每次新连接进入时创建一个新线程。 如何将其修改为每请求线程服务器?我想传入的连接可以放入某种队列中,但是您如何知道哪个连接发出了请求&准备好了服务呢? 我怀疑NIO在这里是必要的,但不确定。 多谢了。 [编辑] 明确一点--原来的“服务器”只是我编写