zoukankan      html  css  js  c++  java
  • 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 超时、服务端未收到请求、服务端处理了但是网络故障)
  • 相关阅读:
    fenby C语言 P32
    fenby C语言 P31 使用数组的指针
    fenby C语言 P30
    fenby C语言 P29
    fenby C语言 P28
    fenby C语言 P27使用指针
    fenby C语言 P25
    fenby C语言 P26
    fenby C语言P24
    Python学习之路:通过socket实现处理多个连接
  • 原文地址:https://www.cnblogs.com/zhishuiyushi/p/13495864.html
Copyright © 2011-2022 走看看