协程和处理 clojure(script) 最佳实践中的异步?
Coroutines and handling async in clojure(script) best practices?
在 clojure 中似乎有无数的 'coroutines' 或异步逻辑的实现,Rich Hickey 和其他潜在权威关于这个问题的许多谈话都是近十年前的,我正在尝试找出处理此问题的最新、最好的最佳实践方法。
我最喜欢这种类型的抽象是 lua 协程,但我认为这些可能是一种严格的命令式做事方式,我对函数式方式是什么感到有点困惑.
在 lua 中,虽然使用协同程序非常简单易行:
A) 非忙等待 X 秒。
B) 非忙等待某个变量或函数为特定值,如true
A用setTimeout大概可以实现,B不行,至少我不知道怎么实现。我也不确定 setTimeout 是解决此类问题的最佳做法吗?
在 a 2013 blog post 中,Rich Hickey 描述了 clojure.core.async
的动机。虽然 JVM 有一些应用程序,但主要动机是给单线程 Javascript 环境带来线程的错觉。
clojure.core.async
提供的“模拟多线程”不如使用实际的 JVM 线程那么健壮(尤其是当 Exceptions/Errors 出现时),因此它对 JVM Clojure 的使用有限。当 Java virtual threads 成为现实时更是如此。
因此,如果您使用 ClojureScript,clojure.core.async
总比没有好得多(即回调地狱)。然而,即使是 JS 也在考虑 a multithreading model via WebAssembly,因此未来 ClojureScript 可能存在 clojure.core.async
的替代方案。
在 clojure 中似乎有无数的 'coroutines' 或异步逻辑的实现,Rich Hickey 和其他潜在权威关于这个问题的许多谈话都是近十年前的,我正在尝试找出处理此问题的最新、最好的最佳实践方法。
我最喜欢这种类型的抽象是 lua 协程,但我认为这些可能是一种严格的命令式做事方式,我对函数式方式是什么感到有点困惑.
在 lua 中,虽然使用协同程序非常简单易行:
A) 非忙等待 X 秒。
B) 非忙等待某个变量或函数为特定值,如true
A用setTimeout大概可以实现,B不行,至少我不知道怎么实现。我也不确定 setTimeout 是解决此类问题的最佳做法吗?
在 a 2013 blog post 中,Rich Hickey 描述了 clojure.core.async
的动机。虽然 JVM 有一些应用程序,但主要动机是给单线程 Javascript 环境带来线程的错觉。
clojure.core.async
提供的“模拟多线程”不如使用实际的 JVM 线程那么健壮(尤其是当 Exceptions/Errors 出现时),因此它对 JVM Clojure 的使用有限。当 Java virtual threads 成为现实时更是如此。
因此,如果您使用 ClojureScript,clojure.core.async
总比没有好得多(即回调地狱)。然而,即使是 JS 也在考虑 a multithreading model via WebAssembly,因此未来 ClojureScript 可能存在 clojure.core.async
的替代方案。