就在我寫更多core.async碼,即出現一個很常見的模式就是去環,超過通道序列低價競標,並不會響應某些工作提高到一個消息,例如:什麼是在clojure core.async go-loop中工作的方式的權衡?
(go-loop [state {}]
(let [[value task] (alts! tasks)]
...work...
(recur state))
我不我覺得我理解我可以通過各種方式實際完成工作的權衡,所以我想我會試着在這裏探索它們。
- 內嵌或通過調用函數:這將阻止循環繼續,直到工作完成。由於它在一個go塊中,所以不想進行I/O或鎖定操作。
- >!向工作人員監控的通道發送一條消息:如果通道已滿,則通過停車直到通道有容量來阻止迴路。這允許螺紋做其他工作並且允許背壓。
- > !!一條消息:如果通道已滿,則通過睡眠執行go循環的線程來阻塞。這可能是不受歡迎的,因爲執行線程是一個嚴格有限的資源。
- >!在另一個go塊中的消息:除非沒有可用的線程,否則這將幾乎立即成功。相反,如果頻道已滿並且正在慢慢消耗,這可能會短時間內使線程系統癱瘓。
- > !!帶有線程塊的消息:類似於go塊,但是消耗系統線程而不是線程,因此上限可能更高
- puts!一條消息:目前尚不清楚什麼是權衡
- 將來會調用工作函數:將工作交給clojure代理池中的一個線程來執行,允許go循環繼續。如果輸入速率超過輸出速率,則會增加代理緩衝池隊列的無限制。
此內容摘要是否正確而全面?