关于协程方便的数据同步问题

来源:13-5 使用RWMutex锁同步协程

邱晨100

2021-05-02

老师好,以前跟着您学到Python高级开发,当时讲过线程和进程为什么需要做数据同步,以及锁的作用。因为线程和进程都有单独的内核空间,且线程需要把变量拷贝到自己的线程栈上,因此产生了数据不一致的问题。
但是很奇怪协程为什么也有这样的问题啊?照说它们运行在一个系统级线程中,都是共享的相同的变量才对啊,又不存在把变量拷贝到自己的栈上

写回答

2回答

bobby

2021-05-03

你能通过写代码来举例说明一下问题吗? 比如协程同步的问题?

0
7
bobby
回复
邱晨100
这个问题问的挺好的,协程确实是运行到同一个线程中的,也就是同一个线程中的变量对于协程都是共享的,所以如果你的协程中没有await等待的话 理论上是可以不用去做同步的,因为只要你不await就不会被其他的协程给抢占执行,但是你如果不确定其他的每个使用该变量中途都不会使用await交出cpu的话可以不用使用同步的方式的
2021-05-05
共7条回复

邱晨100

提问者

2021-05-04

package main


import (

"fmt"

"sync"

)


var total int

var wg sync.WaitGroup

var lock sync.Mutex


//互斥锁 读写锁 数据同步 能不用锁就不用锁

func add() {

defer wg.Done()

for i := 0; i < 100000; i++ {

lock.Lock()

total += 1

lock.Unlock()

}

}

func sub() {

defer wg.Done()

for i := 0; i < 100000; i++ {

lock.Lock()

total -= 1

lock.Unlock()

}

}

func main() {


wg.Add(2)

go add()

go sub()

wg.Wait()

fmt.Println(total)

}



0
0

Go+Python打造电商系统 自研微服务框架 抓紧高薪机遇

快速转型Go工程师,成为具备双语言后端能力的开发者

508 学习 · 530 问题

查看课程