目錄僅需任意任務完成
所有任務都完成
物件池懶漢式,執行緒安全
適用於只執行一次的任務,比如載入配置檔案。
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)func init()
func main() )
}}
這裡所有任務都完成了,但是只用了最快的乙個結果,所以是所有任務都完成了;
當有乙個任務完成時,取消其他任務,因為任務都是有開銷的。
package main
import (
"fmt"
"runtime"
"time"
)func runtask(id int) string
func firstresponse() string (i)
} return <-ch
}func main()
基於csp實現
package main
import (
"fmt"
"sync"
)func main() ()
}()} counter := 0
for i := 0; i < max; i++
fmt.println("counter:", counter)
}
waitgroup實現
package main
import (
"fmt"
"sync"
)func main() ()
counter++
}(i)
} wg.wait()
fmt.println("counter:", counter)
}
適合通過復用降低複雜物件的建立和gc的代價
協程安全,會有鎖的開銷
生命週期受gc影響,不適合做連線池等需要自己管理生命週期的資源的池化。
基於buffered channel實現物件池,取用完後放回channel
package object_pool
import (
"errors"
"fmt"
"testing"
"time"
)type reusableobject struct
type objectpool struct
func newobjectpool(numofobject int) *objectpool
objectpool.bufchan = make(chan *reusableobject, numofobject)
for i := 0; i < numofobject; i++
} return &objectpool
}func (pool *objectpool) getobject(timeout time.duration) (*reusableobject, error)
}func (pool *objectpool) releaseobject(object *reusableobject) error
}func testobjpool(t *testing.t) ); err != nil
for i := 0; i < 11; i++ else
} }fmt.println("done")
}
每次獲取物件,可能會受鎖的限制,所以是建立物件的開銷大,還是鎖帶來的開銷大需要根據實際情況權衡。
package main
import (
"fmt"
"runtime"
"sync"
)func syncpool() ,
} v := pool.get().(int)
fmt.println(v)
pool.put(3)
runtime.gc() //gc 會清除sync.pool中快取的物件
v1, _ := pool.get().(int)
fmt.println(v1)
}func syncpoolinmultigoroutine() ,
} pool.put(1)
pool.put(2)
pool.put(3)
pool.put(4)
var wg sync.waitgroup
for i := 0; i < 10; i++ (i)
} wg.wait()
}func main()
golang 閒談併發
對於併發這個概念,我想大家都對它不會陌生,今天就從簡單的火車站賣票問題出發,來談談併發。首先宣告本文的 是golang 因為最近開始用的就是golang 對於其他的語言其實也是相通的,那麼正式開始正題吧,首先我們來看看,賣一張票,總票數就減一,一般來說我們會這麼寫 package main impo...
golang 併發實踐
golang 高併發主要是依靠sync包下的api實現,首先就是waitgroup 先說說waitgroup的用途 它能夠一直等到所有的goroutine執行完成,並且阻塞主線程的執行,直到所有的goroutine執行完成。waitgroup總共有三個方法 add delta int done wa...
GoLang 併發小結
006.併發 1 概念 1.1 goroutine是go並行設計的核心,goroutine的本質是輕量級執行緒 1.2 golang的runtime實現了對輕量級執行緒即goroutine的智慧型排程管理 1.3 p m g原理 1.3.1 runtime有p m g三個概念,p對應作業系統程序 對...