为什么要选择 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
去重;