core.async中有三种并行pipelines:pipeline
,pipeline-blocking
和pipeline-async
。这些函数的第一个参数是n
,即管道的“并行性”。
这个论点的含义是什么?
它如何影响各种管道的行为?并行性的默认值是多少?何时以及为何我会增加或减少该值?如果正在运行的程序中有多个这样的管道怎么办?
答案 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?不同的进程的访问需求是否跨越盘片?)变得相关。
一般情况下:使用与线程池大小调整相同的判断,经验和调整/测量技术。