在通道上使用传感器时,是否执行了阻止主线程的传感器?
例如(chan 1 long-running-trans)
这段代码会延迟主线程直到执行完毕吗?
答案 0 :(得分:4)
创建一个频道并不会在主执行线程上做任何事情,因为传感器只有在你把东西放入频道后才会生效。
当你这样做时,从线程占用的角度来看会有不同的结果,这取决于你是在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的正常规则。