Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.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
Clojure core.async管道中parallelism参数的含义和用途是什么?_Clojure_Core.async - Fatal编程技术网

Clojure core.async管道中parallelism参数的含义和用途是什么?

Clojure core.async管道中parallelism参数的含义和用途是什么?,clojure,core.async,Clojure,Core.async,core.async中有三种并行类型:管道,管道阻塞,和管道异步。这些函数的第一个参数是n,即管道的“并行性” 这个论点的意义是什么 它如何影响每种管道的性能?什么是好的并行默认值?何时以及为什么要增加或减少该值?如果一个正在运行的程序中有多个这样的管道,该怎么办?提供了信息: (dotimes[\un] (案例类型) :阻塞(螺纹) (让[工作]( n这里提供了parallelism参数;因此它控制线程的数量(在阻塞模式下)或go-loops(在计算或异步模式下) 什么构成“良好的默认值”取决

core.async中有三种并行类型:
管道
管道阻塞
,和
管道异步
。这些函数的第一个参数是
n
,即管道的“并行性”

这个论点的意义是什么

它如何影响每种管道的性能?什么是好的并行默认值?何时以及为什么要增加或减少该值?如果一个正在运行的程序中有多个这样的管道,该怎么办?

提供了信息:

(dotimes[\un]
(案例类型)
:阻塞(螺纹)
(让[工作](
n
这里提供了parallelism参数;因此它控制线程的数量(在阻塞模式下)或
go-loop
s(在计算或异步模式下)

什么构成“良好的默认值”取决于您的负载配置文件、硬件资源和c—如果某个作业在网络访问上阻塞,您可能会拥有比CPU更多的线程,而如果它在CPU上阻塞,那么比您预期的可用内核更多的线程是一种浪费;如果您的瓶颈是本地磁盘I/O,那么许多细节将远远超出此问题的范围on(旋转盘片或NVRAM?不同进程的访问需求是否分布在盘片上?)变得相关


一般来说:使用与线程池大小调整相同的判断、经验和调优/测量技术。

这里缺少的一个重要的不明显的东西——如果我的理解正确的话——是其中一个与其他的不同。在
管道
管道阻塞
中,parallelsm确实像你说的那样控制工作人员的数量,所有这些考虑因素都适用。但是在
管道异步
中,有多少工作人员以及工作人员的类型并不是由这个参数决定的,相反,它所做的是控制异步作业调度器的数量,而这个数字似乎并不重要。因此在我看来
pipeline async
除了1或2之外,没有理由将其作为
n
传递。在
pipeline async
中,预期给定的函数将立即返回,但会导致结果写入其传递的通道(并关闭该通道)在以后的某个时候,这是非常正确的。为了补充Charles所说的,我使用了
管道异步
来创建一个管道,将60个连接汇集到一个异步数据库。今天在Clojure Jira上看到了一些关于这一点的有趣输入:
   (dotimes [_ n]
     (case type
           :blocking (thread
                      (let [job (<!! jobs)]
                        (when (process job)
                          (recur))))
           :compute (go-loop []
                               (let [job (<! jobs)]
                                 (when (process job)
                                   (recur))))
           :async (go-loop []
                             (let [job (<! jobs)]
                               (when (async job)
                                 (recur))))))