Clojure 如何确定从写入程序关闭core.async通道的时间';是哪一方?

Clojure 如何确定从写入程序关闭core.async通道的时间';是哪一方?,clojure,core.async,Clojure,Core.async,我有一个流程,它基本上是长轮询实现的一部分。简而言之,客户机向服务器发出请求,然后服务器创建一个通道并将其返回给该客户机。频道将包含客户要求的信息。由于这是用于长时间轮询,因此客户端请求的信息可能会更改。如果信息发生变化,服务器会将更新写入通道,理论上,客户端可以获取更新并反映更新 我面临的问题是,有可能我最终会使用大量通道,这可能会在更新时导致不必要的处理。我可能正在更新客户不再关心的频道 我的解决方案是,一旦客户端不再关心信息,它就会关闭通道,以某种方式通知服务器,并阻止服务器进行额外的处理

我有一个流程,它基本上是长轮询实现的一部分。简而言之,客户机向服务器发出请求,然后服务器创建一个通道并将其返回给该客户机。频道将包含客户要求的信息。由于这是用于长时间轮询,因此客户端请求的信息可能会更改。如果信息发生变化,服务器会将更新写入通道,理论上,客户端可以获取更新并反映更新

我面临的问题是,有可能我最终会使用大量通道,这可能会在更新时导致不必要的处理。我可能正在更新客户不再关心的频道

我的解决方案是,一旦客户端不再关心信息,它就会关闭通道,以某种方式通知服务器,并阻止服务器进行额外的处理和更新

服务器如何知道通道是否已关闭?在这种情况下,服务器本质上是一个写入程序,不从通道读取任何内容。此外,所有的写入方法都封装在一个go块中,因此它总是返回一个通道(我没有看到任何nils)。有没有办法做到这一点,或者我的方法完全不可行


谢谢

请参见下面链接中的讨论,并注意建议“您只能关闭制作人端的频道。”


今年早些时候,有一个新功能名为“putret”。此更改使所有put函数在由于频道关闭导致put失败时返回false。这就产生了这样的习语:

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

您可以使用
clojure.core.async.impl.protocols/closed?
。clojure core.async中的许多内容已完成99%:)

IMO“仅限生产方关闭”的观点相当误导。制作人可能已死亡或无响应,或者您可能希望重新启动系统或部分系统,而无需重复各种
alt使用“停止通道”等模糊模式