进程池和线程池概述
进程池和线程池相似,所以这里我们以进程池为例介绍,下面对进程池的讨论完全适用于线程池(如果没有特殊声明)。
进程池是由服务器预先创建的一组子进程,这些子进程的数目在3~10个之间(典型情况)。线程池的数量应该和CPU数量差不多。
进程池中的所有子进程都运行者相同的代码,并具有相同的属性。因为进程池在服务器启动之初就创建好了,所以每个子进程都相对“干净”,即它们没有打开不必要的文件描述符(从父进程继承而来),也不会错误的使用大块的堆内存(从父进程复制得到)。
当有新的任务到来时,主进程将通过某种方式选择进程池中的某一个子进程来为之服务。相比于动态创建子进程,选择一个已经存在的子进程的代价显然要小得多。至于主进程选择哪个子进程来为新任务服务,有两种方式:
- 主进程使用某种算法来中东选择子进程。最简单常用的算法是随机算法和RoundRobin(轮流选取算法),但是更智能的算法将使任务在各个工作进程中更均匀的分配,从而减轻服务器的整体压力。
- 主进程和所有子进程通过一个共享的工作队列来同步,子进程都睡眠在该工作队列上。当有新的任务到来时,主进程将任务添加到工作队列中。这将唤醒正在等待任务的子进程,不过只有一个子进程将获得新任务的“接管权”,它可以从工作队列中取出任务并执行,而其他子进程