如何确定从写入方面关闭core.async信道?

7
我有一个进程,基本上是长轮询实现的一部分。简而言之,客户端向服务器发出请求,服务器创建一个通道并将其返回给该客户端。该通道将包含客户端请求的信息。由于这是用于长轮询的,客户端请求的信息可能会更改。如果信息更改,服务器将更新写入通道,理论上,客户端可以获取更新并反映出来。
我面临的问题是可能会出现大量通道,这可能会在更新发生时导致不必要的处理。我可能会更新客户端不再关心的通道。
我的解决方案是,一旦客户端不再关心信息,它就关闭通道,通道会以某种方式通知服务器,并防止服务器进行额外的处理和更新。
服务器如何知道通道是否关闭?在这种情况下,服务器基本上是一个写入者,不从通道中读取任何内容。此外,所有写入方法都包装在go块中,因此始终返回一个通道(我没有看到任何nil)。是否有办法做到这一点,或者我的方法完全错误?
谢谢
3个回答

7

今年早些时候,出现了一个名为“putret”的新功能,此更改使所有的 put 函数在由于通道关闭而导致失败时返回 false 。这样就可以使用以下习惯用法:

(when (>! c val)
  (recur (next itms)))

4
你可以使用clojure.core.async.impl.protocols/closed?。在clojure core.async中,很多东西已经完成99%:)
在我看来,“仅生产者侧闭包”视图相当误导人。生产者可能已经死了或无响应,或者您可能想重新启动系统或其中的某些部分,而不需要使用“停止通道”等混淆模式来重复各种alts!

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接