Nodejs线程池的设计与实践

设计一个线程池,在真正写代码之前,有很多设计需要考虑,大概如下:

1任务队列的设计,一个队列,多个线程互斥访问,或者每个线程一个队列,不需要互斥访问。

2 线程退出的设计,可以由主线程检测空闲线程,然后使子线程退出。或者子线程退出,通知主线程。空闲不一定是没有任务就退出,可以设计空闲时间达到阈值后退出,因为创建线程是有时间开销的。

3 任务数的设计,每个线程可以有个任务数,还可以增加一个总任务数,即全部线程任务数加起来

4 选择线程的设计,选择任务数最少的线程。

5 线程类型的设计,可以区分核心线程和预备线程,任务少的时候,核心线程处理就行。任务多也创建预备线程帮忙处理。

6 线程池类型的设计,cpu密集型的,线程数等于核数,否则自定义线程数就行。

7 支持任务的取消和超时机制,防止一个任务时间过长或者死循环。

本文介绍的线程池具体设计思想如下(参考java):

1 主线程维护一个队列,子线程的任务由子线程负责分发,不需要互斥访问,子线程也不需要维护自己的队列。

2 线程退出的设计,主线程负责检查子线程空闲时间是否达到阈值,是则使子线程退出。

3 任务数的设计,主线程负责管理任务个数并应有相应的策略。

4 选择线程的设计,选择任务数最少的线程。

5 线程类型的设计,区分核心线程和预备线程,任务少的时候,核心线程处理就行。任务多也创建预备线程帮忙处理。

6 线程池类型的设计,cpu密集型的,线程数等于核数,否则自定义线程数就行。

7 支持任务的取消和超时机制,超时或者取消的时候,主线程判断任务是待执行还是正在执行,如果是待执行则从任务队列中删除,如果是正在执行则杀死对应的子线程。下面我们看一下具体的设计。

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章