请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

这样的架构图是不是更准确的描述scheduler版本?

图片描述

  1. request和work chan 都是chan,run里面的slice其实是为了方便调度器select做的“缓存”,其实维护的“队列”本意应该是维护channel,对吧?
  2. engine中创建worker,给每个worker的输入链接为workchan(创建一个chan类型的engine.Request),有多少个worker就创建多少个workchan,这些workchan,当有request来的时候,就将request注入到workChan中,这也就是为什么workerChan是一个chan chan engine.Request的类型,因为他接收的类型是 chan request。
  3. 当有request从worker获取的时候,scheduler将从request chan收到的request,再将request从worker chan发到worker去执行。

这样通过scheduler的调度器(goroutine)通过request和workchan,两个slices进行了异步调控。
以上是我对本章scheduler版本的spider的总结

有一个疑问:
我看到很多这样的用法

go func(){
	for{
	...
	}
}()

在goroutine里面有一个for的循环,这样的写法是一个特定的语法吗?还是这是带有channel的goroutine的常用模式?

正在回答 回答被采纳积分+3

1回答

ccmouse 2020-10-10 19:19:27
这个总结的图画的太好了!你下面的这些理解都是正确的。对,本意其实是不想在select处阻塞,所以一旦select触发尽快把收到的值处理掉。然而我又不能发给其他channel,这样会引起selec...
登录后可查看完整回答登录/注册
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信