Leetcode concurrency in golang總結

Chunting Wu
Mar 31, 2021

--

這次在leetcode中選了concurrency類別的6題(總共也只有6題)來練習golang,主要是為了熟悉golang的語法,和體會goroutine的強大。實際解題後,對於golang這個語言又有了新一層的認知,在這篇我會就我寫過的程式語言做些比較並給點簡單的心得。

首先,先回顧一下這六題:

#1114,是最簡單的一題,透過channel的強大支援,就可以很好的協調所有的goroutine。

#1115,就再稍微有趣一點,依然可以用channel簡單做,但其實也可以透過Barrier收得更美,只是在Barrier底下要維持foobar的順序要花點心思。

#1116,可以透過channel做,但因為有三個goroutine,要分配誰該做事誰該等待會有點複雜;用Barrier做的話也有誰先誰後的問題要解決。所以最後我決定用一個比較不一樣的選擇:使用生產者消費者模型。

#1117,典型的信號題,透過信號可以順利解決問題,但golang的信號無法空等,和pthread的行為不同,這點要額外注意。

#1195,典型的Barrier題,為什麼這題是典型題,但1115不是?最主要的差別在於,1195的所有worker雖然全部都要按照順序執行某一樣固定任務,但每一個任務只有一個worker確切會做事,因此worker間不需要彼此協調。但1115則是需要foo和bar同步,foo一定要先,才是bar。

#1226,典型的教科書題,哲學家用餐問題。一堆教科書都寫過解法所以也沒什麼好說的,這邊就是其中一種教科書解法,依序拿兩個鎖,反序釋放。

練習了這些同步的問題,對於goroutine和channel有了進一步認識,但這些問題其實沒帶到兩個進階用法:buffered channel和select(unblock read/write),之後我會再找機會練習;另外有些進階語法也沒機會使用到,例如把channel當初func的input/output。這些其實在看open source的時候都還算常見,但因為不熟所以會看得很痛苦,這次沒練習到實屬可惜。

最後是與一些常見語言的比較,這邊舉Linux C、Python3和golang做對比。

語感上Python3還是完勝,主要是因為Python是個弱型別語言,所以變數和容器都可以龍蛇雜處,另外,Python的list/dict也不需要allocate,golang必須要在宣告後make,這點在純Python programmer眼裡實在有夠不自然。但golang還是比C語言好上一截,至少在array/slice的操作上,比起C更加直覺,天生支援回傳多值也比C方便許多。此外,golang的strcut還可以包function,這點也比C更加實用。

golang有一點很特別的是,支援指標/定址,這點褒貶不一,但在我眼裡其實弊大於利。首先,在宣告func和struct時,實在很難搞懂到底要不要加星號,舉例來說,sync.WaitGroup大部分的範例都有加星號,但sync.Mutex卻沒有,這標準是什麼?我現在就也是照抄而已,還沒搞懂背後的原因。至於func的參數,golang天生就是call-by-value,即使是array/slice/map也是call-by-value,這很容易讓無論是C還是Python programmer踩坑。

在multi-task方面,Python可以選擇multi-process/multi-thread/coroutine,golang有天生自帶的goroutine,而C只有multi-process/multi-thread。不得不說,goroutine實在太強太好寫了,Python的coroutine還要搞一堆async/await,麻煩到不行,也有夠不直覺。但goroutine不用,就正常寫就好,在這點絕對是大勝Python十條街以上。而且在同步處理的部分,有channel實在方便,可以通知/等待,在C/Python都必須透過pthread提供的lock和condition來協調,其實不太好用,沒有語法糖。

總體來說,我個人還是覺得Python > golang > C,但在同步處理上或者單一功能的小型app上,golang > Python > C。主要原因有二,其一是goroutine很容易開發;其二,golang可以直接build出binary比起肥死人的Python和一堆side-packages更容易移植。

--

--

Chunting Wu
Chunting Wu

Written by Chunting Wu

Architect at SHOPLINE. Experienced in system design, backend development, and data engineering.

No responses yet