nodejs中并行和串行的理解
背景
最近接到一个 job, 意思大概是对阿里云的 RDS 数据库上的 ip 数据(大概 300w 条)进行处理,并存到一个新的 table 中。
任务相对不难,但是转换并存到的数据库中的速度为 1 row/second,奇慢无比,经过同事的指导,重构之后成功的将速度提升到 50 rows/second(达到所调用的api极限)。
究其原因就是nodejs中的并行和串行的差异,充分利用了 cpu 之后显著的提升了速度。
什么是并行和串行
当系统有一个以上CPU时(现在的电脑应该都是多核的吧),则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行。
串行与并行相对应,是指的我们从事某项工作时一个步骤一个步骤的去实施。
代码理解
1 | // 定义单个任务 |
上面的代码会串行执行每一个 singleTasks 任务,意思就是每次需要等当前任务执行完毕,i 才会 +1, 才会执行下一个 singleTasks 任务。这样做会使我们的程序运行缓慢,难以充分利用 cpu,不能实现并行。
下面我们来看改进之后的代码:
1 | // 定义单个任务 |
这里我们先 map 所有的 ip,让他们同时执行所有的任务,然后放到Promise.all()方法中,等待所有的 taks 共同 resolve 之后,完成任务,这样可以极大的提高执行效率。高效完成任务。
思考
当然,我们在执行 task 的时候还可以考虑包装 task,包括增加重试机制和增加按批次运行的限制,每次只运行一定批次的任务,这样可以保证任务运行时更加稳定。