简易map-reduce封装
-
因为js没有支持goroutine这种轻量级线程,所以cpu密集型计算会导致主进程卡死
-
本库使用worker_threads模块,在调用方法时启动一个子进程池,对较大的任务数组均匀分组,依次交给子进程池里的进程来完成运算任务,从而提高cpu利用效率,可以减少响应时间
方法说明
-
async function runGroupMapReduce(dataArr, context, groupSize, funcMap, funcReduce);
-
dataArr:任务数组的数据
-
context:运行funcMap时的上下文变量或者方法,这是一个key-value对象,value如果是function则会被转换成字符串,其他类型的value必须是可序列化的类型,否则报错
-
groupSize:交给单个子进程的数据条数,例如dataArr长度为1e5,groupSize为2e3,则作除法后向上取整结果为50,最终会向所有子进程总共调用50次运算
-
funcMap:这是一个回调函数,入参为从dataArr截取出来的新数组,运行上下文环境是与当前调用者的上下文分开的,如果需要让funcMap调用当前上下文的变量或者方法,必须通过context参数传入
-
funcReduce:这是一个回调函数,入参为一个数组,数组元素为每次子进程的响应结果,返回值为runGroupMapReduce方法的最终结果
-
function parseContext(context);
- 这个方法把context转换成WCONTEXT
-
async function runInWorker(WDATA, WFUNC, WCONTEXT);
- 把耗时的运算代码交给子进程运行,返回值为运算结果
使用示例:
见test.js