进程要比线程更加吃资源,如果来一个连接就开一个进程,当连接比较多时,进程数量也会跟着多起来,操作系统的调度压力也就会比较大。所以要对服务器开辟的进程数量进行限制,避免系统负载过重。
进程池
采用进程池可以对子进程的数量进行了限制。进程池是通过预先产生多个子进程,共同对服务器套接字进行竞争性的accept
,当一个连接到来时,每个子进程都有机会拿到这个连接,但是最终只会有一个进程能accept
成功返回拿到连接。子进程拿到连接后,进程内部可以继续使用单线程或者多线程同步的形式对连接进行处理。
1 | #!/usr/bin/env python3 |
如果并行的连接数超过进程池的数量,那么后来的客户端请求将会阻塞。上面的所有的进程都阻塞在accept
上,这可能会发生惊群现象。
线程池
与进程池相对对应的,也可以采用线程池模型来实现。每个线程在调用accept
时,需要获得锁。
1 | #!/usr/bin/env python3 |
与进程池类似,如果并行的连接数超过线程池的数量,那么后来的客户端请求将会阻塞。