我第一次接触Clojure core.async,并正在浏览Rich Hickey的这个优秀演示文稿:http://www.infoq.com/presentations/clojure-core-async
我有一个问题,关于他在演示文稿末尾展示的例子:
根据Rich的说法,这个例子基本上试图为特定查询获取Web、视频和图像结果。对于每个结果,它会并行尝试两个不同的来源,并仅拉出最快的结果,整个操作不超过80毫秒,所以如果我们无法在80毫秒内获取图像结果,我们就放弃了。'fastest'函数创建并返回一个新通道,并启动两个go处理程序来竞速检索结果并将其放在通道上。然后我们只需从“fastest”通道中取出第一个结果并将其放入c通道即可。
我的问题是:在我们获取它们的第一个结果后,这三个临时的未命名的“fastest”通道会发生什么?可能仍有一个Go进程正在等待将第二个结果放到通道上,但没有人在听,因此它实际上永远不会完成。由于通道从未绑定到任何东西,似乎我们没有任何方法再次使用它。Go进程和通道会“意识到”没有人再关心它们的结果并清理自己吗?还是我们在这段代码中实际上只是“泄漏”了三个通道/ Go进程?
根据Rich的说法,这个例子基本上试图为特定查询获取Web、视频和图像结果。对于每个结果,它会并行尝试两个不同的来源,并仅拉出最快的结果,整个操作不超过80毫秒,所以如果我们无法在80毫秒内获取图像结果,我们就放弃了。'fastest'函数创建并返回一个新通道,并启动两个go处理程序来竞速检索结果并将其放在通道上。然后我们只需从“fastest”通道中取出第一个结果并将其放入c通道即可。
我的问题是:在我们获取它们的第一个结果后,这三个临时的未命名的“fastest”通道会发生什么?可能仍有一个Go进程正在等待将第二个结果放到通道上,但没有人在听,因此它实际上永远不会完成。由于通道从未绑定到任何东西,似乎我们没有任何方法再次使用它。Go进程和通道会“意识到”没有人再关心它们的结果并清理自己吗?还是我们在这段代码中实际上只是“泄漏”了三个通道/ Go进程?
c
阻塞了 put 操作,fastest
进行了第二个未被消费的 put 操作。在上述代码示例中,c
和fastest
返回的 channel 何时被垃圾回收? - Leon Grapenthin