上节编写了一个最简单的 RPC 服务器模型,简单到同时只能处理单个连接。本节为服务器增加多线程、多进程并发处理能力,同时可以处理多个客户端连接。
多线程
代码如下:
1 | #!/usr/bin/env python3 |
对于每来一个新连接,服务器则开启一个新的线程单独进行处理。每个线程都是同步读写客户端连接。
多进程
上面完成了一个简单的多线程服务器,可以并发处理多个客户端连接。但是Python里多线程使用的并不常见。
因为Python的线程虽然是真正的线程,但解释器执行代码时,有一个
GIL
锁:Global Interpreter Lock
,任何Python线程执行前,必须先获得GIL
锁,然后,每执行100条字节码,解释器就自动释放GIL
锁,让别的线程有机会执行。这个GIL
全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。
所以多数Python服务器推荐使用多进程模型。
1 | #!/usr/bin/env python3 |
对于每来一个新连接,服务器则开启一个新的进程单独进行处理。每个进程都是同步读写客户端连接。