一个很简单但是又不太好理解的问题

一个很简单但是又不太好理解的问题

以下是在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

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-05-17 23:38:01
  1. 每个线程 m 都有自己的 g0。runtime.g0 是和 runtime.m0 绑定的 g0,这个 g0 是 runtime 的一个全局变量,整个系统只有一个;其它普通线程,也有自己的 g0,g0 主要负责执行调度相关的代码(用户代码在普通 g 上执行。

  2. 这个你要看看 Go 的 tcp server 模型,简单来说:

for {
    c, err := listener.Accept()
    // handle connection
    go func() {
        // 用户的连接处理逻辑在各自的 goroutine 里,两者没有任何关系
    } ()
}

3. 这还是有可能的,举个例子,假如这是个在线游戏服务,Ga 和 Gb 在同一个房间都对 boss 进行了攻击,也就是需要修改 boss 的血量,那在修改的时候就必须加锁(或者用 atomic 操作),这就是一种资源竞争,因为他们在同一个房间内打同一个 boss

4. 锁是用来保护公共资源的,大家如果都只是读,那就不用加锁,一旦多个用户对同一个资源有并发的读/写,那就需要使用同步库里的操作进行同步

  • 提问者 一只小popo #1
    1.其实我含糊的就是曹大回答的第四点里的几个关键字,“多个用户”和“同一资源”,这里的多个用户是指同一个用户a在代码中通过go关键字创建的多个gorutine,比如a1-a2-a3,还是就是用户a和用户b 2.其次,同一资源,怪物的血量可以理解成全局共享变量或者资源,操作理应加锁,我看很多来源项目,很多struct里也有一个sync.Mutex的字段,一个struct定义的对象,也能是公共资源吗 3.如果能理解“谁跟谁”去操作“同一资源”,那么这个问题就ok了,还麻烦老师帮忙解答下
    2021-05-18 09:22:18
  • 每个线程 m 都有自己的 g0。runtime.g0 是和 runtime.m0 绑定的 g0,这个 g0 是 runtime 的一个全局变量,整个系统只有一个;

    曹大,这句话的意思是每个线程M有自己的g0,然后还有一个全局的g0么?后者的全局g0的作用是干啥的呢

    2021-05-18 10:13:45
  • Xargin 回复 提问者 一只小popo #3

    一个 struct 也可能被共享呀,net.conn,这一条连接可能被多个 goroutine 并发写呢

    2021-05-18 16:02:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师