为什么要选择 Go 语言?
- 通过
go与goroutine对并发有很好的支持; - 简易的
RPC框架; - 类型安全(相对于
js、python这类的脚本语言); - 自动垃圾回收(没有 UAF 漏洞);
- 相对简单的语法(工业界需要一个像
python一样简单语法的编译型语言);
多线程的挑战:
- Share Data:
Golang中使用sync.Mutex,尽量避免共享可变量; - Coordination:
Glang使用channel、sync.Cond、WaitGroup; - Deallock:线程间的循环等待;
lock/channel 应该在什么时候?
- 一个结论是:大部分的多线程问题可以通过上面两个工具解决;
- 什么时候使用哪个工具取决于程序员的思考,一个建议是:
state状态共享时:使用lock;communication线程间信息交流时:使用channel;
RPC:Remote Procedure Call;
- Client “best effort”:当服务端无响应时,多进行几次尝试后抛出异常;
- Server “at most once”:客户端对每次请求添加
xid唯一表示,服务端通过xid去重;