gpt4 book ai didi

asynchronous - 使用 core.async 阻塞客户端/驱动程序 : are there performance benefits?

转载 作者:行者123 更新时间:2023-12-01 02:14:05 24 4
gpt4 key购买 nike

我正在 Clojure 中编写一个 Web 应用程序后端,其中包括:

  • http-kit作为 HTTP 服务器和客户端(非阻塞)
  • monger作为我的数据库驱动程序(阻塞)
  • clj-aws-s3作为 S3 客户端(阻塞)

  • 我知道事件驱动的非阻塞堆栈的性能优势,例如您在 NodeJS 和 Play 框架上找到的堆栈( this question 帮助了我),以及它如何产生更好的负载能力。出于这个原因,我正在考虑使用 core.async 使我的后端异步。

    我的问题是: 您能否通过在阻塞客户端/驱动程序库之上使用 core.async 来重现非阻塞 Web 堆栈的性能优势?

    详细说明:

    我目前在做什么 是通常的同步调用:
    (defn handle-my-request [req]
    (let [data1 (db/findData1)
    data2 (db/findData2)
    data3 (s3/findData3)
    result (make-something-of data1 data2 data3)]
    (ring.util.response/response result))
    )

    我打算做什么正在将任何涉及 IO 的调用包装在 thread 中阻止,并在 go 中同步它堵塞,
    (defn handle-my-request! [req resp-chan] ;; resp-chan is a core.async channel through which the response must be pushed
    (go
    (let [data1-ch (thread (db/findData1)) ;; spin of threads to fetch the data (involves IO)
    data2-ch (thread (db/findData2))
    data3-ch (thread (s3/findData3))
    result (make-something-of (<! data1-ch) (<! data2-ch) (<! data3-ch))] ;; synchronize
    (->> (ring.util.response/response result)
    (>! resp-chan)) ;; send response
    )))

    这样做有什么意义吗?

    我这样做是因为这是我发现的最佳实践,但它们的性能优势对我来说仍然是个谜。我认为同步堆栈的问题在于它们每个请求使用一个线程。现在看来他们使用了不止一种。

    在此先感谢您的帮助,祝您有美好的一天。

    最佳答案

    您的示例的好处是 findData1,2 和 3 并行运行,这可以以使用更多线程为代价来减少响应时间。

    以我的经验,通常情况是 findData2 的调用依赖于 findData1 的结果,而 findData3 依赖于 findData2 的结果,这意味着调用不能并行化,这种情况下使用 core.async 没有意义

    关于asynchronous - 使用 core.async 阻塞客户端/驱动程序 : are there performance benefits?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26454024/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com