core.async管道中并行性参数的含义和目的是什么?

时间:2017-05-20 21:53:24

标签: clojure core.async

core.async中有三种并行pipelinespipelinepipeline-blockingpipeline-async。这些函数的第一个参数是n,即管道的“并行性”。

这个论点的含义是什么?

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

1 个答案:

答案 0 :(得分:2)

The source提供了丰富的信息:

   (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))))))

n这里提供了并行性参数;因此它控制线程数(在阻塞模式下)或go-loop s(在计算模式或异步模式下)。

什么构成“良好的默认值”取决于您的负载配置文件,硬件资源和&amp; c-如果作业阻止网络访问,您可能拥有比CPU更多的内容,而如果它阻止了CPU,比预期可用的核心更多的线程是浪费;如果你的瓶颈是本地磁盘I / O,那么一些细节远远超出了这个问题的范围(旋转盘片或NVRAM?不同的进程的访问需求是否跨越盘片?)变得相关。

一般情况下:使用与线程池大小调整相同的判断,经验和调整/测量技术。