gpt4 book ai didi

clojure - 如何清理 clojure core.async channel ?

转载 作者:行者123 更新时间:2023-12-04 11:36:47 27 4
gpt4 key购买 nike

我第一次看 Clojure core.async,并且正在阅读 Rich Hickey 的精彩演示:http://www.infoq.com/presentations/clojure-core-async

我对他在演讲结束时展示的例子有疑问:

core.async Web Example

根据 Rich 的说法,这个示例主要是尝试获取特定查询的网络、视频和图像结果。它为每个结果并行尝试两个不同的来源,并为每个结果提取最快的结果。并且整个操作可以不超过 80ms,所以如果我们不能得到例如80ms的图像结果,我们就放弃了。 'fastest' 函数创建并返回一个新 channel ,并启动两个 go 进程竞相检索结果并将其放在 channel 上。然后我们从“最快” channel 中取出第一个结果并将其放到 c channel 上。

我的问题:在我们获得第一个结果后,这三个临时的、未命名的“最快” channel 会发生什么?据推测,仍然有一个 go 进程试图将第二个结果放到 channel 上,但没有人在听,所以它实际上从未完成。而且由于 channel 永远不会绑定(bind)到任何东西,所以我们似乎再也没有办法用它做任何事情了。 go 进程和 channel 会“意识到”没有人再关心他们的结果并清理自己吗?还是我们本质上只是在这段代码中“泄漏”了三个 channel /执行过程?

最佳答案

没有泄漏。

parking go s 被附加到它们试图执行操作的 channel 上,并且除此之外没有独立存在。如果其他代码对 channel 失去兴趣,则某个 go停在(注意,如果停在 go/alt! 上,alts! 可以同时成为多个 channel 的推杆/ catch 手),然后最终它将与这些 channel 一起被 GC'd。

唯一需要注意的是,为了获得 GC,go s实际上必须先 parking 。所以任何go在没有 parking 的情况下不断循环做事( <!/>!/alt!/alts! )实际上将永远存在。不过,很难偶然编写出这种代码。

关于clojure - 如何清理 clojure core.async channel ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29879996/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com