对于QueuedScheduler调度器Submit方法的问题

来源:16-5 重构和总结

爱吃apple的阿狸

2021-09-10

老师,对于前面并发调度器,我们遇到循环等待问题,我们可以把 submit()方法里的 in<-request 放到goroutine去等待,避免主流程for语句阻塞,从而能一直拿out,使worker腾出手接收下一个request;
图片描述

但是后面queued调度器,这里submit() 里面 发送request 就没有用goroutine了,
图片描述

这里用了select ,把得到的所有request 和 workerChan 都存在了slice里面,然后调度。
图片描述
而队列调度器是拿这里requestQ 这个 slice来做缓冲,把所有request汇聚到slice来,让worker处理。这样避免开太多goroutine?
如果没有这里select + slice做缓存,其实submit不加协程还是会阻塞的,对吧?

相当于开成千上万个goroutine 变成了 存大量的request到slice里,内存肯定省很多了。是这个意思吗?
我看了下运行时的requestQ数量在几千左右。

写回答

1回答

ccmouse

2021-09-11

是的。我们用了队列进行缓冲,不然还是会阻塞的。

这里也并不一定队列的方式就比直接开goroutine要好。要看需求。

但是我们用了队列缓冲之后,系统更为可控。我们对goroutine的数量,还有内存的使用量,都能固定下来。我甚至可以说,队列达到多少之后我就在select处暂缓接收新的请求,来控制请求生成和消耗的平衡。

同学可以进一步把这两种调度器分别与我们的模拟相亲网站相连,进行压力测试。观察两种方法在qps,内存及goroutine数量上的趋势。

0
1
爱吃apple的阿狸
非常感谢!
2021-09-12
共1条回复

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程