-
Notifications
You must be signed in to change notification settings - Fork 623
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lec2:RPC与线程机制(Go语言实战) #3
Comments
线程是操作系统级别的并发机制,可以充分利用CPU的多个运算核心,在分布式系统中IO并发都会涉及多线程操作,比如启动一个线程等待其他Server返回IO信息时主线程可以继续处理下一个请求。多线程间可以共享数据信息,但是每个线程都会有自己的程序计数器(PC)、寄存器、栈等,线程是操作系统调度的最小资源单位。 Go语言支持程序多创建线程(在Go语言中表现为协程,即用户态线程,比操作系统级别的线程机制占用资源更少),通常线程数量比物理核数多,Go运行环境会调度这些线程在多核上运行,要注意线程也并非免费的,创建线程要比一个函数方法调用还是费资源。 使用线程时的挑战:
本期问题:请完成Crawler并发练习 需要解决两个挑战:
|
解决方案思考: 查看Crawler示例,Go语言中的并发练习
最佳解决方案: |
Remote Procedure Call (RPC) 分布式系统的关键部分(后面的实验都会涉及使用RPC),RPC理想上想把网络通信实现同本地函数调用一样,RPC的目的:
Go语言有比较好的实现机制 一些实现需要考虑的细节:
特别是需要考虑怎么处理失败?比如:网络丢包,网络断线,服务器运行缓慢,服务器崩溃等问题。
简单方案是实现“至少一次”机制:RPC库等待回复一段时间,如果还是没有回复到达,重新发生请求。重复多次,如果还是没有回复,那么返回错误给应用程序。但是需要应用处理可能出现的多个写副本(因为多次请求导致) 更好的方案是实现“至多一次”机制:服务器的RPC代码发现重复的请求,返回之前的回复,而不是重写运行。客户端让每一个请求带有唯一标示码XID(unique ID),相同请求使用相同的XID重新发送。 实现“至多一次”机制的困难之处:
Go RPC实现的”最多一次“?
参考讲义翻译 |
@chaozh 讲义翻译404了 |
先看看Lab2实验代码labrpc.go中的实现,它很像Go的RPC包,但是带有模拟网络
注意:实验一 MapReduce实现使用的是Go的RPC包 程序结构描述
关键方法
|
课前基础练习:Lab0 Go语言入门
观看视频:Lecture2、Lecture5、讲义
学习示例:
The text was updated successfully, but these errors were encountered: