【问题标题】:Are transducers blocking in core.async?传感器是否阻塞在 core.async 中?
【发布时间】:2015-11-09 12:50:03
【问题描述】:

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

例如(chan 1 long-running-trans)

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

【问题讨论】:

    标签: clojure core.async


    【解决方案1】:

    创建通道本身并不会在主执行线程上做任何事情,因为转换器只有在您将内容放入通道后才会生效。

    当你这样做时,从线程占用的角度来看,会产生不同的后果,这取决于你是在 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 都不会让你的主线程保持忙碌。

    如果您要使用通道运算符的阻塞版本(&gt;!!&lt;!!),那么您明确要求运行时在主线程上执行它们,并且转换器将随时占用您的主线程您将 (&gt;!!) 元素放入通道中。

    JS

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

    【讨论】:

      猜你喜欢
      • 2020-09-16
      • 2011-04-09
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-26
      • 1970-01-01
      相关资源
      最近更新 更多