MIT 6.824 RPC 和多线程

多线程

I/O 并发(做多件事情)、并行(CPU)。

多线程是一个结构化工具,但是有一些坑

Go 叫多线程为 goroutines;

Thread = 执行线程

多线程允许一个程序在执行时去做很多事情。

每个线程都是串行执行,就像是非线程程序

线程可以共享内存

每个线程都有自己的线程状态:程序计数器、寄存器、栈

线程和进程是包含的关系,一个进程可以产生很多线程

在分布式系统中,需要并发执行。而多线程是实现并发已经廉价的方式

I/O 并发:多个客户端同时发送请求到多台 server,并且等待响应。服务器处理多个客户端请求,每个请求可能会阻塞。譬如客户端 X 读取磁盘数据的同时接到处理客户端 Y 的请求。

多核性能:并行的在多个 CPU 执行代码

方便:通过后台运行 worker,进行每秒查询某个值是否有效

线程的替代方案:

yes:在单线程中写非串行逻辑。这种方式也被称为事件驱动。譬如 JavaScript。

做法:使用一个状态表保存所有活动的状态,假设是每个客户端的请求

事件循环:在收到服务器的响应时,传入新的输入值,检查状态表中的每个活动的状态。执行每个活动的下一步。并且更新状态。依次循环完成整个状态表。

利用事件驱动来达到 I/O 并发的目的:这个相比较多线程要更大节约成本。但它不能利用多核,写起代码来也比较痛苦

 Web 爬虫:

  • 获取一个或多个站点的所有的 web 网页。例如:用来构建索引
  • 网页和链接构成是一个图结构
  • 指向某些页面的多个链接
  • 图具有环特征

ConcurrentChannel 爬虫

  • go channel:channel 是一个对象,ch := make(chan int)。通道可以让一个线程发送一个对象给另外一个线程。发送的线程使用 ch <- x 把 j 发送给其他 Goroutine 接收者。接收者通过 y := <- ch 把结果存储到 y 对象中。for y := range ch 等待通道消息。
  • 通道的通信是同步的
  • 通道可以被多个线程发送或者是接收消息
  • 通道对于操作系统非常廉价
  • 发送方在接收者接到消息之前会一直阻塞,直到此条消息被消费(同步,小心死锁)

远程调用(RPC)

远程调用是分布式系统的关键。

RPC 的目的是为了解决客户端程序和服务端易于编程的数据通信,隐藏网络协议、把数据转换成统一的格式,譬如 strings, arrays, maps, &c 转换为 wire 格式

GO RPC 就是 at-more-once 的策略模式,只执行一次。

  • 打开 TCP 连接
  • 发送请求到 TCP
  • 永不进行重发(服务器就看不到重复调用了)
  • 如果没有得到响应,就返回错误.(TCP 超时、服务端未收到请求、服务端处理了但是网络故障)
posted @ 2020-08-13 13:25  止水于石  阅读(260)  评论(0编辑  收藏  举报