GoのGoroutineの使用
3252 ワード
同時concurrency
func initV(out chan
chan非同期処理サイクル印刷
func ChanRange(index int,c chan bool) {
a := 0
for i := 0; i < 100000000; i++ {
a += i
}
fm.Println("a value is:",index, a)
c
sync非同期サイクル印刷
func SyncRange(index int,wg *sync.WaitGroup) {
a := 0
for i := 0; i < 100000000; i++ {
a += i
}
fm.Println("a value is:",index, a)
wg.Done()// ,
}
func goSync() {//
//runtime.GOMAXPROCS(runtime.NumCPU())/ cpu
wg:=sync.WaitGroup{}
wg.Add(10)
for i := 0; i < 10; i++ {
go my.SyncRange(i,&wg)
}
wg.Wait()
}
コンカレントはパラレルではありません==古いバージョンのデフォルト=、Goのすべてのgoroutinesは1つのスレッドでしか走ることができません。つまり、コア数を1に設定すると、goChanメソッドはパラレルではありません。コンカレントです==新しいバージョンのデフォルト==runtime.GOMAXPROCS(runtime.NumCPU())が最大に設定されている場合、彼はパラレルです。
package main
import (
"fmt"
)
func say(s string) {
for i := 0; i < 5; i++ {
fmt.Println(s)
}
}
func main() {
go say("world") // Goroutines
for {
}
}
ここでGoはまだシングルコアを使用しており、forデッドサイクルはシングルコアCPUのすべてのリソースを占めているが、main線とsayの2つのgoroutineは1つのスレッドの中にあるため、sayは実行する機会がない。
func loop() {
for i := 0; i < 10; i++ {
runtime.Gosched() // CPU goroutine
fmt.Printf("%d ", i)
}
quit
-上のコードのようなCPU時間をアクティブに与える方法は、依然としてシングルコアで走っています。しかし、goroutineを手動で切り替えると、見た目の「並列」になります。stackoverflowの説明:https://stackoverflow.com/questions/13107958/what-exactly-does-runtime-gosched-do
goroutineがブロックされると、Goは、goroutineと同じシステムスレッドにある他のgoroutinesを自動的に別のシステムスレッドに移行し、これらのgoroutinesがブロックされないようにします。すなわち、goroutineがブロックされずCPUを解放しません。
package main
import (
"fmt"
"runtime"
)
var quit chan int = make(chan int)
func loop(id int) { // id: goroutine
for i := 0; i < 10; i++ { // 10 goroutine
fmt.Printf("%d ", id)
}
quit
selectの使用
func TwoMoreChan() {
c1, c2 := make(chan bool), make(chan int)
o := make(chan bool)
go func() {
for {
select {
case v, ok :=
func SelectTime() {
c := make(chan bool)
select {
case v :=