0

想探讨下 Go 中的网络编程模式

 6 months ago
source link: https://www.v2ex.com/t/1018095
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Go 编程语言

想探讨下 Go 中的网络编程模式

  fgasdzxc · 8 小时 37 分钟前 · 921 次点击
我知道 Go 是通过 goroutine 来实现高并发,在使用的时候,每个 IO 操作( Accpept 、Read 、Write )使用一个 goroutine 来处理,每个 goroutine 是同步阻塞的。

我还知道 Go 的网络库底层是使用了 epoll 来监听文件描述符的,一旦文件描述符的数据就绪,就把对应的 goroutine 加入到可调度队列中。

也就是说 Go 给我们提供的是同步阻塞的编程接口,使用起来非常方便简捷。但是其底层实现了 IO 多路复用,并且通过配合 GMP 的调度机制来使得就绪的文件描述符可以得到处理。在这个角度来看,Go 的网络编程模式是同步非阻塞的模式。尽管 goroutine 由于 IO 阻塞住了,但是底层的线程并没有阻塞(换了个线程接着调度之后的 goroutine ),并且通过底层的 IO 多路复用机制,一旦文件描述符就绪,相应的 goroutine 就可以被加入调度队列。

上面这些是我对 Go 的网络编程模式的理解

但是同时,又在很多博客中看到说 Go 是异步的网络编程模式,我对异步 IO 的理解是,主线程的调用直接返回,并且异步线程处理完会调用回调函数来通知主线程它处理完了返回结果。但是 Go 中显然是没有回调函数这个东西的,这算异步吗?

认为 Go 是异步的网络编程模式的人认为,新开的 goroutine 不会阻塞当前 goroutine ,所以是异步的

我想问一下我们通常所说的异步与异步 IO 是一个东西吗?

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK