core.async 中的换能器是否阻塞?

Are transducers blocking in core.async?

在通道上使用传感器时,传感器的执行是否会阻塞主线程?

例如(chan 1 long-running-trans)

这段代码会延迟主线程直到执行完成吗?

创建通道本身不会在主执行线程上执行任何操作,因为只有在将内容放入通道后传感器才会生效。

当你这样做时,从线程占用的角度来看会有不同的后果,这取决于你是 运行宁在 JVM 上还是在 JS 运行time:

JVM

在以下区块中:

(let [pipe (chan 1 long-running-trans)]
  (go
    (>! pipe "stuff"))
  (go
    (let [stuff (<! pipe)]
      (println stuff))))

go 块中出现的任何代码都将是 executed within a dedicate threadpool。因此,put 和 get 都不会让您的主线程忙碌。

如果您要使用通道运算符的阻塞版本 (>!! or <!!),那么您会明确要求 运行时间在主线程上执行它们,并且传感器会占用每当您将 (>!!) 一个元素放入频道时您的主线程。

JS

当你在 JS 引擎上 运行 时,你只有一个执行线程和通道运算符的非阻塞版本(>!<!)。因此,您的传感器确实会影响您的主线程和唯一线程。然后执行将遵循 JS event loop.

的正常规则