2024 Clojure状态调查!中分享你的想法。

欢迎!请参阅关于页面以了解本服务的更多信息。

0
Clojure
(defn get-result-from-first-engine
"Performs search on Powells and Cultura and returns the results
which comes first"
[query]
(let [result (promise)]
    (doseq [engine ["powells" "cultura"]]
        (future (if-let [engine-result (search query engine)]
            (deliver result engine-result)
        ))
    )
    (println "First result: " (deref result 2000 "timed out"))
))

(defn -main
    [& args]

    (time (do
        (println (search "clojure" "powells"))
        (println (search "clojure" "cultura"))
    ))

    (time (get-result-from-first-engine "clojure"))
)

此代码是我解决《Clojure for the Brave and True》第九章第一练习问题的部分。我想并行执行两个请求,并获取先处理完成的响应。

发生了两件奇怪的事情

  • 并行的时间比在main中编写的顺序时间低很多。下面是结果示例。时间差异如此之大,以至于我认为Clojure可能以某种方式进行了缓存。我没有使用memoize或类似的任何东西。
  • main不停止运行。它有点像在等待输入或处理某个东西。我的理论是,future不会停止运行,但我不知道为什么

并行和顺序的时间差异

https://www.powells.com/book/clojure-cookbook-9781449366179
https://www3.livrariacultura.com.br/clojure-94991222/p
"Elapsed time: 2185.2716 msecs"
First result:  https://www3.livrariacultura.com.br/clojure-94991222/p
"Elapsed time: 63.5558 msecs"

预先感谢您的帮助

1 回答

0

如果你有一个慢和一个快的来源,结果看起来很有可能?

future使用一个后台线程,该线程被缓存以重复使用,最多可重复使用1分钟,并将防止JVM退出。你可以使用(shutdown-agents)来停止它。

感谢您的回答。`(shutdown-agents)`有效:)。

关于时间问题,我在运行顺序时,获取每个请求和并行的耗时。并行的耗时总是稍微长一些,我认为是因为线程的创建和管理。

请纠正我如果我是错的。不管怎样,非常感谢你的帮助!!
...