Go语言的优势
Go语言在多线程、锁、RPC等的使用非常方便,但在其他语言如C++等很复杂。
- good support for threads/RPC:对线程和RPC的支持度高
- gc:自带GC,无需考虑垃圾回收问题
- type safe:类型安全
- simple:简单易上手
- compiled:编译型语言,运行时开销更低
多线程
在Go中,线程称为goroutine,线程只有最基本的PC程序计数器、一套寄存器Registers、一个栈Stack,这样就能描述当前的执行状态。
Why we need Threads
- I/O 可能导致阻塞,多线程可以分配一个线程给I/0(such as network IO) (避免阻塞)
- 利用现代计算机多核处理器cpu(多核并行,提高整体吞吐量)
- background threads做些处理。(守护线程)
多进程和多线程的区别?
在同一个进程中,线程之间共享内存,可以使用channel(Go中的概念)进行同步,但进程之间是没有交集的
多线程的挑战
-
race conditions:多线程会引入竞态条件的场景
- avoid sharing:避免共享内存以防止竞态条件场景的产生(Go有一个竞态检测器race detector,能够辅助识别代码中的一些竞态条件场景)
- use locks:让一系列指令变成原子操作
-
coordination:同步协调问题,比如一个线程的执行依赖另一个线程的执行结果等
- channels:通道允许同时通信和协调
- condition variables:配合互斥锁使用
-
deadlock:死锁问题,比如在go中简单的死锁场景,一个写线程往channel写数据,但是永远没有读线程从channel读数据,那么写线程被永久阻塞,即死锁,go会抓住这种场景,抛出运行时错误runtime error。
Why Go?
good support for threads/RPC
:对线程和RPC的支持度高gc
:自带GC,无需考虑垃圾回收问题type safe
:类型安全simple
:简单易上手compiled
:编译型语言,运行时开销更低
Go如何实现多线程
- channels
- 条件变量
- waitGroup
RPC
什么是RPC?
- RPC全称Remote Procedure Call译为远程过程调用
- RPC是一个计算机通信协议,允许调用不同进程空间的程序。
- RPC允许跨机器、跨语言调用计算机程序方法。
- RPC的客户端和服务器可以在一台机器上,也可以在不同的机器上。
程序员使用RPC时,就像调用本地程序一样,无需关注内部的实现细节。运行于一台计算机的程序调用另一台计算机的子程序,程序员无需额外地为交互作用编程。RPC允许开发者直接调用另一台计算机上的程序,开发者无需额外地为这个调用过程编写网络通信相关代码,使得开发包括网络分布式程序在内的应用程序更加容易。
总结
虽然这节课的title是RPC和Threads,但是并没有讲到PRC,我看的是2020版的,同学们的提问有点太多了,感觉有点偏题了都。加上我也还没学完GO,学起来真有点费劲,后面先把go的基本语法学了吧。然后后面应该会去看21年版本的了,据说讲的要好一些。
更多的笔记后面再补。