Concurrency Clojure core.async go块何时有用?
由于运行go块的线程池相当小,因此似乎不建议在go块内执行某些操作。例如,执行计算繁重的操作是不好的。在go块中运行的一些这样的操作将占用整个线程池,其他go块根本无法运行Concurrency Clojure core.async go块何时有用?,concurrency,clojure,Concurrency,Clojure,由于运行go块的线程池相当小,因此似乎不建议在go块内执行某些操作。例如,执行计算繁重的操作是不好的。在go块中运行的一些这样的操作将占用整个线程池,其他go块根本无法运行 Clojure程序员使用go块最常见的场景是什么?它主要用于处理已经异步的库吗?使用库/代码将回调转换为更容易接受的通道变体?我很有兴趣看到一些实际的例子,其中带有驻车通道操作的go块比线程更可取。每个线程的堆栈都需要最小的内存量(),等等。虽然几百个线程在一台普通计算机上可能不是问题,但几千个或更多线程可能会消耗大量内存(
Clojure程序员使用go块最常见的场景是什么?它主要用于处理已经异步的库吗?使用库/代码将回调转换为更容易接受的通道变体?我很有兴趣看到一些实际的例子,其中带有驻车通道操作的go块比线程更可取。每个线程的堆栈都需要最小的内存量(),等等。虽然几百个线程在一台普通计算机上可能不是问题,但几千个或更多线程可能会消耗大量内存(即1000个线程=>1GB内存)。而且,即使线程被阻塞(未运行),这些资源也会被消耗 假设您有一个只运行1-10%时间的任务。那么使用常规线程会消耗比所需资源多10-100倍的资源。由于go通过“驻车”阻止共享线程,您可以将所需的线程资源减少10-100倍。这就是好处
第二个好处是,
core.async
可以在ClojureScript中使用并在浏览器中运行只有一个线程,core.async
允许人们在浏览器中有多线程的错觉,即使常规Java线程不可用。简而言之,在异步clojure应用程序中使用core.async
通道时使用go
块
core.aysnc
为您提供了内置的反压力,也就是说,一种机制说“不,我不会创建新的工作线程,因为我们已经很忙了”(即,创建100000个go
块不会破坏您的系统,但不要在家中使用线程或具有无限队列的线程池尝试此操作)。这是一个巨大的成功,并且无需自行同步线程。需要背压的问题(如生产者-消费者问题)通常很适合此模型,core.async是一个不错的选择
但是,