go语言通信理解

文章讨论了Go语言中的通信方式,强调了通过管道(channel)通信优于使用共享内存。Go的管道天然支持阻塞,避免了共享内存带来的加锁解锁问题。同时,Go有自己的调度器,当线程阻塞时能更有效地分配资源。这与依赖操作系统的调度不同,例如Node.js的单线程模型。
摘要由CSDN通过智能技术生成

相信大家都在官网看到这样一段话,“不要通过共享内存来通信,要通过通信开共享内存”。

要理解这段话,首先要复习进程间通信和线程间通信的方式:

Linux进程间通信:管道(匿名管道和有名管道)、信号、消息队列、共享内存、信号量、套接字(socket)

Linus线程间通信:互斥量、信号量、条件变量

Windows进程间通信:管道、共享内存、消息队列、信号量、套接字(socket)

Windows线程间通信:临界区、互斥量、事件

go语言比较特别,它的线程(协程)支持管道(pipe),为啥这么说呢?

因为管道在系统上,是进程间通信方式。如果这里不明白,把前面介绍Linux进程通信,Linux线程通信,Windows进程通信,Windows线程通信的再多看几遍。

共享内存在Windows和Linux中是用来做进程间通信的,很明显go不支持,因为go用的是线程。

但是go语言的线程支持管道(channel,在系统中是用来做进程间通信的),而管道的好处就是天然的支持阻塞,而共享内存(共享变量)需要反复加锁,解锁,等待。

再啰嗦一点,go语言实现了自己的调度器,在用户态多线程调度,当一个线程阻塞时,它会把资源分给没阻塞的线程。这点和多线程模型有很大的区别,以nodejs为例,它有一个主线程和一堆IO线程,但是它没有自己的调度器,而是依赖操作系统来进行调度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值