【发布时间】:2015-11-09 12:50:03
【问题描述】:
在通道上使用转换器时,该转换器的执行是否会阻塞主线程?
例如(chan 1 long-running-trans)
这段代码会延迟主线程直到执行完成吗?
【问题讨论】:
标签: clojure core.async
在通道上使用转换器时,该转换器的执行是否会阻塞主线程?
例如(chan 1 long-running-trans)
这段代码会延迟主线程直到执行完成吗?
【问题讨论】:
标签: clojure core.async
创建通道本身并不会在主执行线程上做任何事情,因为转换器只有在您将内容放入通道后才会生效。
当你这样做时,从线程占用的角度来看,会产生不同的后果,这取决于你是在 JVM 上运行还是在 JS 运行时上运行:
在以下块中:
(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 event loop 的正常规则。
【讨论】: