一个很简单但是又不太好理解的问题
以下是在Linux里运行一个web服务器的过程:
1、go build main.go生成main二进制文件
2、发布系统将这个main二机制文件push到物理机器并执行类似于./main
3、至此,一个简易的web服务已经启动,g0也创建完成,等待用户请求
问题:
1、所有的用户请求都是落到这个机器,整个系统里只有一个g0吗
2、假设现在只有两个请求进来,用户A和用户B,假设他们运行期间只产生一个G,Ga1和Ab1,这2个G直接有联系吗
3、Ga1和Gb1他们会去竞争某些公共资源吗
4、我的理解是Ga1和Gb1分属于2个不同的gorutine,之间应该没啥联系,但是看很多源码或者开源项目里,sync.Mutex经常用来锁住某些操作,如果没有区别,为啥需要锁住,这里就开始矛盾了
5、锁的意义,是针对一个用户产生的多个gorutine,还是针对不同用户产生的gorutine,其实这里是被redis这种第三方锁干扰了,redis锁是针对不同的用户来讲的
正在回答 回答被采纳积分+1
每个线程 m 都有自己的 g0。runtime.g0 是和 runtime.m0 绑定的 g0,这个 g0 是 runtime 的一个全局变量,整个系统只有一个;其它普通线程,也有自己的 g0,g0 主要负责执行调度相关的代码(用户代码在普通 g 上执行。
这个你要看看 Go 的 tcp server 模型,简单来说:
for { c, err := listener.Accept() // handle connection go func() { // 用户的连接处理逻辑在各自的 goroutine 里,两者没有任何关系 } () }
3. 这还是有可能的,举个例子,假如这是个在线游戏服务,Ga 和 Gb 在同一个房间都对 boss 进行了攻击,也就是需要修改 boss 的血量,那在修改的时候就必须加锁(或者用 atomic 操作),这就是一种资源竞争,因为他们在同一个房间内打同一个 boss
4. 锁是用来保护公共资源的,大家如果都只是读,那就不用加锁,一旦多个用户对同一个资源有并发的读/写,那就需要使用同步库里的操作进行同步
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星