golang總結 併發

2022-09-20 00:54:09 字數 3073 閱讀 5122

目錄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. select
select 的特點是:不會阻塞,哪個管道有值,我取哪個。所以,下面當執行到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對應作業系統程序 對...