2014-07-23 33 views
4

我有一個基本上是長輪詢實現的一部分的進程。簡而言之,客戶端向服務器發出請求,然後服務器創建一個通道並將其返回給該客戶端。該頻道將包含客戶要求提供的信息。由於這是爲了用於長輪詢,因此客戶請求的信息可能會發生變化。如果信息發生變化,服務器會將更新寫入通道,理論上,客戶端可以獲取更新並反映該信息。如何確定core.async頻道何時從作者身邊關閉?

我面臨的問題是,我有可能結束大量的頻道,當發生更新時可能導致不必要的處理。我可能會更新客戶不再關心的渠道。

我的解決方案是,一旦客戶端停止關心信息,它會關閉通道,它會以某種方式通知服務器,並阻止服務器進行額外的處理和更新。

服務器如何知道通道是否關閉?在這種情況下,服務器本質上是一個作家,不會從通道讀取任何內容。另外,所有的寫入方法都被封裝在一個go塊中,所以它總是返回一個通道(我沒有看到任何nils)。有沒有辦法做到這一點,或者我的方法完全關閉?

感謝

回答

3

截至今年早些時候,有一個名爲「putret」新功能,這種改變使得它如此都放在功能如果看跌失敗,因爲通道返回false被關閉。這允許這樣的成語:

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

您可以使用clojure.core.async.impl.protocols/closed?。因爲clojure core.async中有很多東西已完成99%:)

IMO「製造商方關閉」視圖頗具誤導性。生產者可能死機或無響應,或者您可能希望重新啓動系統或其中的一部分,而無需重複使用「停止渠道」等模糊處理模式。