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