关于不可接管阻塞问题补充

来源:1-4 Go 程序是怎么跑起来的

Garry_27

2021-05-19 13:08:08

1、对一些磁盘读写这种较长时间等待的阻塞属于不可接管阻塞吗
2、go中对于处理io阻塞问题有用到io多路复用吗,如果有能列举哪些用到了吗。
3、对于大量不可接管阻塞go如何优雅的处理的
4、syscall阻塞时M和G会锁定吗

写回答

1回答

Xargin

2021-05-19

  1. 磁盘读写确实是不可接管的,在 runtime 里的 FD 区分 pollable 和非 pollable,网络的那种才是 pollable,可以接管,文件的不行

  2. 你这个 io 多路复用我没理解。。。是说的网络协议里的多路复用么,一条连接上可以并发收发请求?类型 http2 那样的?

  3. 没有太好的办法,我们线上的服务一般和文件系统打交道比较少,还好,如果碰上了的话,一般可能是固定的 goroutine 数消费 channel(内存里的 buffer) 去写文件,控制被阻塞的数量,不让线程数涨太高。但实际场景还是会有线程数爆炸的情况的,我们在线上碰到过,特别一些用 cgo 的。

  4. syscall 阻塞的时候 M 和 G 是在一起的,不会分开。只会把 P 拿走


0
hargin
回复
harry_27
hp>网络 io,linux 系统给我们提供的是同步非阻塞接口,如果 os 提供的是阻塞接口(其实就是 syscall),那在 Go 里面也处理不了,只能开线程。


开线程就得注意线程数

h021-05-20
共2条回复

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程