Go语言进阶并发线程| 青训营
一、语言进阶(并发编程)
并发:如图左,多个线程程序在一个核的CPU上执行
并行:如图右,多个线程程序在多个核的CPU上执行
1. Goroutine
协程:用户态,轻量级线程,栈KB级别。
线程:内核态,线程跑多个协程,栈MB级别。
例子:打印hello goroutine
package main
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine : " fmt.Sprint(i))
}
func HelloGoRoutine() {
for i := 0; i < 5; i {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
func main() {
HelloGoRoutine()
}
运行结果:
2. CSP (Communicating Sequential Processes)
3. Channel
例子(通过通讯来共享内存):
package main
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
// 运行A协程
go func() {
defer close(src)
for i := 0; i < 10; i {
src <- i
}
}()
// 运行B协程
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}()
// 主线程
for i := range dest {
println(i)
}
}
func main() {
CalSquare()
}
4. 并发安全(Lock)
例子:通过共享内存通信
package main
import (
"sync"
"time"
)
var (
x int64
lock sync.Mutex
)
func addWithLock() {
for i := 0; i < 2000; i {
lock.Lock()
x = 1
lock.Unlock()
}
}
func addWithoutLock() {
for i := 0; i < 2000; i {
x = 1
}
}
func Add() {
x = 0
for i := 0; i < 5; i {
go addWithoutLock()
}
time.Sleep(time.Second)
println("WithoutLock:", x)
x = 0
for i := 0; i < 5; i {
go addWithLock()
}
time.Sleep(time.Second)
println("WithLock:", x)
}
func main() {
Add()
}
运行结果,通过多次运行,不加锁的情况可能会导致结果不符合预期:
1.5 WaitGroup
例子:
package main
import (
"fmt"
"sync"
)
func hello(i int) {
println("hello goroutine : " fmt.Sprint(i))
}
func ManyGoWait() {
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 5; i {
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
func main() {
ManyGoWait()
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfhahhb
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13