沒原生Thread Pool,那我們自製Worker Group

可以先看看上一篇沒Thread Pool,Limiter也好?真的嗎? 來個前情提要。

Worker Group其實基本概念跟Thread Pool很像,就是:

  • 一堆Worker在跑,等著接收參數並且輸出結果
  • 單一Worker擁有一個用來輸入參數的channel,以及一個用以輸出結果的channel
  • Worker可被context的Done()終結,或者:
  • 可被WaitGroup終結

不過由於go沒有generic(目前版本是1.16,在1.17/1.18會支援),所以這兩個channel都沒辦法寫得很漂亮,這也是大多數Worker Pool要不就是得用chan interface{}來寫,不然就是寫不出來。不過Worker Group這種東西其實夠輕量,輕量到其實自己打造都是可以的,這邊就介紹一下怎麼自己打造一個Worker Pool,以及揭秘為什麼很多CLI/UI都需要有一個自己的UI Thread(go沒thread,所以稱為UI routine吧)。

Read more “沒原生Thread Pool,那我們自製Worker Group”
itemprop="discussionURL"1 Comments

沒Thread Pool,Limiter也好?真的嗎?

眾所皆知Go是沒有原生的Thread Pool這種東西,這在寫Crawler的時候會造成一些小小的不便。比方說你想要crawl PTT,這樣打一打大概2秒內DDoS protection就把你擋起來了:

docUrlList, _ := GetDocUrlList() //拿到某個版的文章列表
for _, docUrl := range docUrlList {
	go func() {
		docUrl := docUrl
		p, _ := ParseSingleRawDocument(docUrl)
		parseChannel <- p
	}()
}
Read more “沒Thread Pool,Limiter也好?真的嗎?”
itemprop="discussionURL"2 Comments