go 多进程与非缓冲通道

go实现了真正的多线程, 既然是真正地多线程,那么什么叫做虚假的多线程

我们知道 python 实现了虚假的线程: 当虚假的线程共享同一个cpu时,大家采用时间分片去执行,但是当 某个线程发出 阻塞信息的时候, 比如 输入函数 ,整个程序就会被挂起 ,导致其他线程也无法被执行

提醒:

  chan1 := make(chan int ,[ size])

当没有设定 chan 的 size 的时候,默认 0
什么叫做chan的size 当 size =0称为 非缓冲通道
只有 chan1 <- 和 <- chan1 配对时 才可以继续执行
否则进程阻塞等待

但是在缓冲通道中, 只有 chan1 中 数量为0 时
<- chan1 操作才会被阻塞,但是chan <-不会被阻塞

或者 chan1 数量 = size chan1 <- 会被阻塞,但是 <- chan1 不会被阻塞

来看看go 是否实现了真正的不会被阻塞的线程

func gogetinput(goid int, chan1 chan int) string {
    input1 := ""
    fmt.Scanln(&input1)
    fmt.Println(goid, " 输入是", input1)
    chan1 <- 1
    return input1
}

为什么要创建chan1 因为 go 中 默认不会等待进程的结束

func main() {
    chan1 := make(chan int)

    go gogetinput(1, chan1)
    fmt.Print("没有被阻塞")

    <-chan1
}

输出结果
lmk@pop-os:~/gocode/src/studycolly$ go run usegoprocess.go
没有被阻塞 \nasasas
1 输入是 \nasasas

很明显根据顺序执行的逻辑,应该是先接受 用户的输入 然后进行 打印 没有被阻塞
但是用户输入属于一个阻塞进程,所以无法执行,直到用户输入

但是如果 main 中的 <- chan1 改为 chan1<- 1 ,
gogetinput中的 chan1<-1 改为 <-chan1

则主进程不会等待子进程的结束,我们也就无法看到效果了

Go 很多线程同步 wg

//定义同步变量
var wg sync.WaitGroup

func main(){
for i:=1;i<10;i++{

    wg.Add(1)
    go func(){
            print(i)
            wg.Done()
        }()
    }
//等待所有协程完成
wg.Wait()
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuemake999

请我喝茶呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值