目錄golang 通過乙個go關鍵字就可以開啟乙個協程。
func main()
func sayhello()
}func sayhello2()
}
//通過sync.waitgroup來等待所有執行緒完成
package main
import (
"fmt"
"sync"
)func main()
w.add(2)
go sayen(w)
go sayzh(w)
w.wait()
}func sayen(w *sync.waitgroup)
w.done() //每當這個方法完成則減少1
}func sayzh(w *sync.waitgroup)
w.done() //每當這個方法完成則減少1
}
管道的定義:
//無緩衝管道
flag := make(chan bool)
//有緩衝管道
data := make(chan int, 10)
//向管道中新增值
data <- 10
//從管道中取值
agr := <- data
<- data //也可以直接釋放值,不用變數接收
1. 通過go實現同步package main
import (
"fmt"
)func main()
func sayen_chan(w chan bool)
w <- true //方法完成寫入通道
}func sayzh_chan(w chan bool)
w <- true
}
2. 正確處理累加package main
import (
"fmt"
"sync/atomic"
)var (
count int64
)func main()
func add(w chan bool)
w <- true
}
3. 通道實現資料共享package main
import (
"fmt"
"math/rand"
"sync"
)var wg sync.waitgroup
func main()
func player(name string, count chan int)
tmp := rand.intn(100)
if tmp % 13 == 0
fmt.printf("運動員 %s 擊球 %d \n", name , i)
i ++
count <- i
}}
4. 緩衝管道package main
import (
"fmt"
"sync"
"time"
)var (
numbertasks = 10
workers = 4
)var wg2 sync.waitgroup
func main()
for j := 1; j <= numbertasks; j++
close(tasks)
wg2.wait()
}func work(tasks chan int, worker int)
fmt.printf("工號:%d, 開始工作:%d\n", worker, task)
time.sleep(time.microsecond * 100)
fmt.printf("工號:%d, 完成工作:%d\n", worker, task)
}}
5. selectselect 的特點是:不會阻塞,哪個管道有值,我取哪個。所以,下面當執行到go的時候,a,b還沒有添值,所以只能選擇defaul執行,這裡可以把defualt
部分和b<-2
去掉,select會被阻塞,直到a<-1執行
func main() ()
select
}
6. runner併發模型package runner
import (
"errors"
"os"
"os/signal"
"time"
)type runner struct
var errortimeout = errors.new("receive timeout")
var errorinterrupt = errors.new("interrupt error")
func new(duration time.duration) *runner
}func (r *runner) add(tasks...func(int))
func (r *runner) getinterrupt() bool
}func (r *runner) run() error
task(id)
} return nil
}func (r *runner) start() error ()
select
}
測試
package main
import (
"gorounting/runner"
"log"
"os"
"time"
)const (
timeout = 4 * time.second
)func main()
} log.println("程式結束")
}func createtask() func(int)
}
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對應作業系統程序 對...