Go 高階併發模式 第一部分

2021-09-26 12:41:29 字數 2370 閱讀 4007

寫**難,寫處理並行和併發的**更難!要做到這一切並保持高效將是極具挑戰性的。

今天,我決定開始分享一些技巧來處理某些特殊情況。

有時,你想要為你的 channel 操作定時:持續嘗試做一些事情,如果不能在一段時間內完成就放棄繼續嘗試。

要做到這一點,你可以使用 context 或者 time,兩者都很好。context可能更慣用,而 time 則更高效,但它們幾乎是完全相同的:

1 func tochantimedcontext

(ctx context.context, d time.duration, message type, c chan<

- type)

(written bool)10}

1112 func tochantimedtimer

(d time.duration, message type, c chan<

- type)

(written bool)

21}

由於並不真正關心效能(畢竟我們是在等待),我發現唯一的區別是使用 context 的解決方案會執行更多的分配(也因為使用 timer 的那種可以進一步優化以** timer)。

請注意,重複使用 timer是非常複雜的。因此請記住,如果僅僅為了節省10 allocs/op 的資源損耗而去復用timer,很可能並不值得。

如果你感興趣,這裡 有關於如何使用 timer 的文章。

有時你希望將相同的訊息寫入多個 channel,先寫入任何可用的 channel,但絕不要在同一 channel 上兩次寫入相同的訊息。

要做到這一點,有兩種方法:你可以使用區域性變數遮蔽 channel,並相應地禁用 select的case子句,或者使用 goroutine/wait 方案。

1 func firstcomefirstservedselect

(message type, a, b chan<

- type)9}

10}1112 func firstcomefirstservedgoroutines

(message type, a, b chan<

- type)()

16 go func()

()17 wg.

wait()

18}

請注意,在這種情況下,效能可能很重要。而且在編寫生成goroutine的解決方案時,所花費的時間幾乎是使用 select 的解決方案的4 倍。

如果在編譯期不知道 channel 的數量,則第乙個解決方案將變得更為複雜,但仍然有可能實現,而第二個解決方案則基本保持不變。

注意:如果你的程式有許多未知大小的活動部件,則有必要進行重新設計,因為這很可能簡化它。

如果你的**在你檢查後仍然有未繫結的活動部分,這裡有兩個解決方案來提供支援 :

1 func firstcomefirstservedgoroutinesvariadic

(message type, chs ...chan<

- type)()

7}8 wg.

wait()

9}1011 func firstcomefirstservedselectvariadic

(message type, chs ...chan<

- type)19}

20for i :=0

; i <

len(chs)

; i++

24}

不用說:使用反射的解決方案比使用 goroutine 的解決方案慢幾個數量級,所以請不要使用它。

如果你想在一段時間內嘗試幾次傳送並且如果它在這裡花費了太多時間就中止嘗試,這裡有兩種解決方案:一種是time+select,另一種是 context+go。如果在編譯期知道channel 的數量,則第一種更好,否則,就應該使用另乙個方案。

1 func tochanstimedtimerselect

(d time.duration, message type, a, b chan type)

(written int)12}

13 t.

stop()

14return215

}1617 func tochanstimedcontextgoroutines

(ctx context.context, d time.duration, message type, ch ...chan type)

(written int)34}

()35}

36 wg.

wait()

37return

int(wr)

38}

Axure RP 第一部分

axure rp是乙個專業的快速原型設計工具。axure 發音 ack sure 代表美國axure公司 rp則是rapid prototyping 快速原型 的縮寫。axure rp是美國axure software solution公司旗艦產品,是乙個專業的快速原型設計工具,讓負責定義需求和規格...

第一部分 初識Solr

第一章 solr簡介 這章主要包括內容 這本書講述nosql技術,apache solr 像它的非關係模式兄弟一樣,針對於某些問題進行了優化。特別的,solr在處理企業級大量資料 及時搜尋 文字資料 返回相關性結果等方面進行了很大優化。這裡說的只是冰山一角,讓我們從下面幾方面來進行詳細敘說 solr...

css排雷第一部分

import url basic.css warning urgent plant moons plant moons 1 a href span title feature lang en 選出屬性等於lang或者以lang開頭的所有元素。選擇h1 strong 可以解釋為選擇h1字元素中的所有s...