RPC and threads
使用go语言来表现线程和RPC
Why use go?
- 良好的线程支持
- 方便的 RPC
- 类型安全
- 垃圾回收机制
- 编程相对简单
Why use thread?
- 表达了并发性,在分布式系统中需要
- I/O 并发性
- 多核,性能高
- 方便
Threading challenges
- 共享数据的存贮
- 在线程之间共享可变数据的协调
- 死锁
网络爬虫实例
目标是获取所有网页,例如提供给索引器
Crawler challenges
- 利用 I/O 并发
- 获取每个 URL 只获取一次
- 需要知道什么时候完成
解决方案
- 串行爬虫,执行深度优先通过递归串行调用进行探索,通过引用传递,调用者看到被调用者的更新,一次只获取一页。
- ConcurrentMutex 爬虫,为每个页面获取创建一个线程,线程共享“获取”映射,需要使用互斥锁Lock() 和 Unlock(),wait() 等待所有 Add() 被 Done() 平衡,即等待所有子线程完成。
- ConcurrentChannel 爬虫,使用Go 通道,通道是一个对象,通道让一个线程将对象发送到另一个线程,注意死锁。master() 创建一个工作程序 goroutine 来获取每个页面, worker() 在一个频道上发送页面的 URL 片段。
远程过程调用 (RPC)
- 是分布式系统机器的关键部分
- 目标:易于编程的客户端/服务器通信
- 隐藏网络协议的细节
- 将数据(字符串、数组、映射等)转换为“wire format”