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

时间:2015-11-09 12:50:03

标签: clojure core.async

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

例如(chan 1 long-running-trans)

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

1 个答案:

答案 0 :(得分:4)

创建一个频道并不会在主执行线程上做任何事情,因为传感器只有在你把东西放入频道后才会生效。

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

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都不会让你的主线程忙碌。

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

JS

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