MIT6.824 L2 RPC and Threads
线程
线程数量取决于:
- 架构。例如:一个线程用作客户端,一个线程用作后台任务。
- 多核并行。Go运行时自动在可用内核上调度可运行的goroutine。
- IO并发。取决于延时和容量,随吞吐量增长而增长。
- Go线程(goroutine)成本很低,但比一次方法调用高。
风险
- 共享数据:
- Mutex原子性保证
- 使用并发安全的数据
- 线程间协作:
- 等待所有线程完成—> WaitGroup & Channel for go
- 并发粒度:
- 粗:逻辑简单,但是并发少
- 细:带来数据竞争和死锁
爬虫挑战
共享锁 vs. Channel
大多数情况下,两者都能使用,但是主要通过以下几点决定使用哪种:
- 状态:共享锁
- 交互:Channel
- 等待:Channel
RPC
以前写过,这里就不再写一遍了