Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency Clojure core.async go块何时有用?_Concurrency_Clojure - Fatal编程技术网

Concurrency Clojure core.async go块何时有用?

Concurrency Clojure core.async go块何时有用?,concurrency,clojure,Concurrency,Clojure,由于运行go块的线程池相当小,因此似乎不建议在go块内执行某些操作。例如,执行计算繁重的操作是不好的。在go块中运行的一些这样的操作将占用整个线程池,其他go块根本无法运行 Clojure程序员使用go块最常见的场景是什么?它主要用于处理已经异步的库吗?使用库/代码将回调转换为更容易接受的通道变体?我很有兴趣看到一些实际的例子,其中带有驻车通道操作的go块比线程更可取。每个线程的堆栈都需要最小的内存量(),等等。虽然几百个线程在一台普通计算机上可能不是问题,但几千个或更多线程可能会消耗大量内存(

由于运行go块的线程池相当小,因此似乎不建议在go块内执行某些操作。例如,执行计算繁重的操作是不好的。在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是一个不错的选择


但是,Go/<代码>宏不是CuljuleCub库的一部分,它不打算作为通用工具来实现并发。它的目的是提供异步代码顶部的抽象,使其以更同步的方式流动。考虑您的用例,如果模型适合,就去吧!

谢谢答案。所以,若我有一个任务运行1%的时间,我可以节省约100 MB的内存?大概是为了节省更多的内存(在GBs+中),我需要让任务运行0.1%的时间?我想我的问题是,对于(JVM)Clojure-这些是什么类型的任务?这取决于你!一个例子是任何类型的I/O都会阻塞线程,无论是网络还是磁盘/DB。但是用go块阻塞I/O是不好的,不是吗?它会阻塞整个线程,所以其中一小部分会阻塞整个线程池?