gpt4 book ai didi

multithreading - Clojure go block 中的线程/ sleep

转载 作者:行者123 更新时间:2023-12-04 04:34:21 24 4
gpt4 key购买 nike

我在 Clojure go 块中使用 Thread/sleep 有内部冲突。一般不建议在 go 块内有任何长时间运行的进程,以及 Stuart Sierra mentions that sleeping in go block is not preferred :

In general, any work which doesn't block, sleep, or do I/O can be safely put in a go block without having a major impact on the throughput of the system.



就我而言,我想收听 channel 上的消息,并将它们分组,然后再通知用户它们是否来得很快。或者,如果只有一条消息,请通知用户。在我的特定用例中,多条消息快速连续或单独出现是很常见的,并且消息不太可能定期出现。

为了实现这一点,我有一个 go-loop在 channel 上等待输入的块。当它接收到它时它会休眠一点(最多一两秒钟),检查在此期间是否有任何其他输入到达 channel ,并基于此通知用户整个事件或仅传递第一条消息。

我不会有一堆这样的 go在我的应用程序中阻止,只有一个。由于 Clojure 总是会产生多个线程来为 go 块提供服务,因此在实践中用 sleep 阻塞一个线程应该不成问题。但从理论上讲,我想知道是否有更优雅的方法来处理这个而不用像这样绑一个线程?

最佳答案

而不是阻塞在 Thread/sleep你应该使用 clojure.core.async/timeout .有an example on ClojureDocs与您的场景非常相似:

(go-loop [seconds (atom 0)
add-seconds! #(swap! seconds + %)]
(println "Waiting 1 second")
(<! (timeout 1000))
(add-seconds! 1)
(println "Waiting 2 seconds")
(<! (timeout 2000))
(add-seconds! 2)
(println
(format "Waited %s seconds"
@seconds)))

关于multithreading - Clojure go block 中的线程/ sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40505031/

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