golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了
go task()
package main
import (
"fmt"
"time"
)
func show(msg string) {
for i := 0; i < 5; i++ {
fmt.Printf("msg: %v\n", msg)
time.Sleep(time.Microsecond * 1000)
}
}
func main() {
go show("go show") //开辟goroutines中运行
show("haha") //这个会在main函数的goroutines中运行
//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完
fmt.Println("end..........")
}
channel 还可按是否带有缓冲区分为:
unbuffered:=make(channel int)
buffered:=make(channel int,10)
package main
import (
"fmt"
"math/rand"
"time"
)
var channeltest = make(chan int)
func show(msg string) {
value := rand.Intn(10)
channeltest <- value // 往管道中写数据
}
func main() {
defer close(channeltest) // 关闭管道
go show("go show") //开辟goroutines中运行
time.Sleep(time.Second * 1)
value := <-channeltest //从channel中获取数据
fmt.Printf("value: %v\n", value)
//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完
fmt.Println("end..........")
}
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func a() {
defer wg.Done()
for i := 0; i < 10; i++ {
fmt.Println("a函数")
time.Sleep(time.Microsecond * 100)
}
}
func b() {
defer wg.Done() //别忘了在一次执行完毕后运行这个函数
for i := 0; i < 10; i++ {
fmt.Println("b函数")
time.Sleep(time.Microsecond * 100)
}
}
func main() {
wg.Add(1) //在每一个go之前执行这个行数
go a() //开辟goroutines中运行
wg.Add(1)
go b()
wg.Wait()
//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完
fmt.Println("end..........")
}
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
var wg sync.WaitGroup
var value int = 100
var lock sync.Mutex
func a() {
defer wg.Done()
for i := 0; i < 100; i++ {
lock.Lock()
value += 1
lock.Unlock()
fmt.Println("a++")
time.Sleep(time.Microsecond * 100)
}
}
func b() {
defer wg.Done()
for i := 0; i < 100; i++ {
lock.Lock()
value -= 1
lock.Unlock()
fmt.Println("a--")
time.Sleep(time.Microsecond * 100)
}
}
func main() {
fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())
runtime.GOMAXPROCS(8) //最大并发
wg.Add(1)
go a()
wg.Add(1) //开辟goroutines中运行
go b()
wg.Wait()
fmt.Println("end..........")
fmt.Printf("value: %v\n", value)
}
package main
import (
"fmt"
"runtime"
)
func a() {
for i := 0; i < 2; i++ {
fmt.Println("a函数")
}
}
func main() {
fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())
runtime.GOMAXPROCS(8) //最大并发
go a() //开辟goroutines中运行
for i := 0; i < 2; i++ {
runtime.Gosched() //让出CPU,执行A函数
fmt.Printf("i: %v\n", i)
}
fmt.Println("end..........")
}
package main
import (
"fmt"
"time"
)
var valueint = make(chan int)
var valurstring = make(chan string)
func main() {
//关闭通道后会读取类型默认值,如int默认值为0
go func() {
valueint <- 100
valurstring <- "haha"
defer close(valueint)
defer close(valurstring)
}()
for {
select {
case r := <-valueint:
fmt.Printf("valueint: %v\n", r)
case r := <-valurstring:
fmt.Printf("valurstring: %v\n", r)
default:
fmt.Println("default .....")
}
time.Sleep(time.Second)
}
}
package main
import (
"fmt"
"runtime"
"time"
)
var valueint = make(chan int)
func main() {
ticker := time.NewTicker(time.Second)
//关闭通道后会读取类型默认值,如int默认值为0
go func() {
//每秒钟随机的往通道插入数据
for _ = range ticker.C {
select {
case valueint <- 1:
case valueint <- 2:
case valueint <- 3:
}
}
}()
var sum int
for v := range valueint {
fmt.Printf("v: %v\n", v)
sum += v
if sum >= 10 {
runtime.Goexit()
}
}
}