10.Go-goroutine,waitgroup,互斥锁,channel和select – Python量化投资

10.Go-goroutine,waitgroup,互斥锁,channel和select

10.1.goroutine goroutine的使用 //Learn_Go/main.go
package main

import (
“fmt”
“time”
)

func demo(count int) {
for i :=1; i < 10; i++{ fmt.Println(count,":",i) } } func main() { for i :=1; i < 10; i++{ go demo(i) } //添加休眠时间等待goroutine执行结束 time.Sleep(3e9) } 10.2.waitgroup WaitGroup直译为等待组,其实就是计数器,只要计数器中有内容将一直阻塞 WaitGroup有三种方法 Add(delta int)表示向内部计数器添加增量(delta),其中参数delta可以使负数 Done() 表示减少waitgroup计数器的值,应当在程序最后执行,相当于Add(-1) Wait()  表示阻塞知道waitgroup计数器为0 //Learn_Go/main.go package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup wg.Add(5) for i := 0; i < 5; i++{ go func(j int) { fmt.Println("第",j,"次执行") wg.Done() }(i) } wg.Wait() fmt.Println("程序结束") } 10.3.互斥锁和读写锁 (1)互斥锁 可以使用sync.Mutex对内容加锁,互斥锁的使用场景 多个gouroutine访问同一个函数代码段 操作一个全局变量 为了保证共享变量安全性,值安全性 (2)读写锁 Go语言中的map不是线程安全的,多个gouroutine同时操作会出现错误 RWMutex可以添加多个读锁或者一个写锁,读写锁不能同时存在 map在并发下读写就需要结合读写锁完成 互斥锁表示锁的代码同一时间只能有一个goroutine运行,而读写锁表示在锁范围内数据的读写操作 //Learn_Go/main.go package main import ( "fmt" "sync" ) func main() { var rwm sync.RWMutex var wg sync.WaitGroup wg.Add(10) m := make(map[int]int) for i := 0; i < 10; i++{ go func(j int) { rwm.Lock() m[j] = j fmt.Println(m) rwm.Unlock() wg.Done() }(i) } wg.Wait() fmt.Println("程序结束") } 10.4.channel channel是进程内通信方式,每个channel只能传递一个类型的值,这个类型需要在声明channel时指定 channel在Go中主要的两个作用:同步和通信 (1)声明channel的语法 var 名称 chan 类型 var 名称 chan https://www.cnblogs.com/derek1184405959/p/11333376.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论