对于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回答
-
是的。我们用了队列进行缓冲,不然还是会阻塞的。
这里也并不一定队列的方式就比直接开goroutine要好。要看需求。
但是我们用了队列缓冲之后,系统更为可控。我们对goroutine的数量,还有内存的使用量,都能固定下来。我甚至可以说,队列达到多少之后我就在select处暂缓接收新的请求,来控制请求生成和消耗的平衡。
同学可以进一步把这两种调度器分别与我们的模拟相亲网站相连,进行压力测试。观察两种方法在qps,内存及goroutine数量上的趋势。
012021-09-12
相似问题