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.
的正常规则
在通道上使用传感器时,传感器的执行是否会阻塞主线程?
例如(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.