请稍等 ...
×

采纳答案成功!

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

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

回答1 浏览110 2020-10-09 13:47:31

图片描述

  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的常用模式?

添加回答

1回答

  • 这个总结的图画的太好了!你下面的这些理解都是正确的。对,本意其实是不想在select处阻塞,所以一旦select触发尽快把收到的值处理掉。然而我又不能发给其他channel,这样会引起selec...
    2020-10-10 19:19:27

Google资深工程师深度讲解Go语言

难度中级
时长24小时20分钟
人数4408
好评度99.8%

语法+分布式爬虫实战 为转型工程师量身打造,让你彻底掌握go语言

讲师

ccmouse 全栈工程师

讲师曾任职于Google,担任高级软件工程师,Tech Leader,拥有十余年后端开发经验,精通C ,Java,Go,分布式系统开发等,精通分布式系统设计,从Go语言早期就开始关注和使用Go语言,对Go语言背后的实现及设计理念有独到的见解。

意见反馈 帮助中心 APP下载
官方微信