2 回答

TA貢獻(xiàn)1829條經(jīng)驗 獲得超13個贊
Dewy Broto 為您的問題提供了很好的解決方案。這是一個簡單直接的解決方案,但我想更廣泛地評論您如何為不同的問題尋找解決方案。
Go 使用通信順序進(jìn)程代數(shù) (CSP) 作為通道、選擇和輕量級進(jìn)程 ('goroutines') 的基礎(chǔ)。CSP保證事件的順序;當(dāng)您通過做出選擇(又名select)這樣做時,它只會引入非確定性。有保證的排序有時被稱為“先發(fā)生”——它使編碼比替代(廣受歡迎)的非阻塞風(fēng)格簡單得多。它還為創(chuàng)建組件提供了更多空間:通過渠道以可預(yù)測的方式與外部世界交互的長期功能單元。
或許關(guān)于頻道阻塞的討論在人們學(xué)習(xí)圍棋的方式上設(shè)置了心理障礙。我們在 I/O 上阻塞,但我們在通道上等待。如果系統(tǒng)作為一個整體有足夠的并行松弛度(即其他活動的 goroutines)來保持 CPU 忙碌,那么等待通道是不會皺眉的。
可視化組件
所以,回到你的問題。讓我們從組件的角度考慮它,您有許多需要探索的點來源。假設(shè)每個源都是一個 goroutine,然后它在您的設(shè)計中形成一個帶有輸出通道的組件。Go 允許共享通道端,因此許多源可以安全地按順序?qū)⑺鼈兊狞c交錯到單個通道上。您無需執(zhí)行任何操作 - 這就是頻道的工作方式。
Dewy Broto 描述的批處理功能本質(zhì)上是另一個組件。作為一種學(xué)習(xí)練習(xí),以這種方式表達(dá)它是一件好事。批處理組件具有一個點輸入通道和一個批次輸出通道。
最后,HTTP i/o 行為也可以是一個具有一個輸入通道而沒有輸出通道的組件,僅用于接收整批點然后通過 HTTP 發(fā)送它們。
以只有一個來源的簡單情況為例,這可能是這樣描述的:
+--------+ point +---------+ batch +-------------+
| source +------->-------+ batcher +------->-------+ http output |
+--------+ +---------+ +-------------+
這里的目的是在基本層面描述不同的活動。這有點像數(shù)字電路圖,這不是巧合。
你確實可以在 Go 中實現(xiàn)它,它會起作用。它甚至可能工作得很好,但在實踐中您可能更喜歡通過組合成對的組件來優(yōu)化它,必要時重復(fù)。在這種情況下,很容易將批處理器和 http 輸出結(jié)合起來,這樣做最終會得到 Dewy Broto 的解決方案。
重要的一點是 Go 并發(fā)最容易發(fā)生
(a)不要預(yù)先擔(dān)心阻塞;
(b)描述需要在相當(dāng)細(xì)粒度的級別上發(fā)生的活動(在簡單的情況下,您可以在頭腦中完成);
(c)如有必要,通過將功能組合在一起進(jìn)行優(yōu)化。
我將把更高級的可視化移動通道端(Pi-Calculus)主題作為挑戰(zhàn),其中通道用于將通道端發(fā)送到其他 goroutine。
- 2 回答
- 0 關(guān)注
- 204 瀏覽
添加回答
舉報