代码如下:
console.time(“Wav2DnnScoreEntry”);
Wav2DnnScore.interface.Wav2DnnScoreEntry(13, ForwardProQualityArgv);
console.timeEnd(“Wav2DnnScoreEntry”);
console.time(“HVite_entry”);
HviteDnn.interface.HVite_entry(21, AlignProQualityStdArgv);
console.timeEnd(“HVite_entry”);
console.time(“HVite_entry”);
HviteDnn.interface.HVite_entry(21, AlignProQualityExtArgv);
console.timeEnd(“HVite_entry”);
以上三个均是对C++库的调用,每个函数的运行时间均为500ms,串行执行需1500ms,求指教:能不能通过并发提高速度呢?
有个promiseAll的方法
来自酷炫的 CNodeMD
c++层写异步回调
来自酷炫的 CNodeMD
@lvyueyang promise.all对cpu计算密集型来说,并不是并行的
@zswnew 不修改C++库的情况下还有什么其它的方法么?
你要计算结果,可以多进程啊,计算完再返回数据
@Einsy 是通过child_process模块么?尝试过,碰一鼻子灰。。
不改C++层面的话, node跑cluster, 分给子进程去做, 前提是你有多核CPU. 最终任务的执行时间和你子任务中执行时间最长的那个比较接近.
单独写个c++文件调用并编译后,用child_process.exec调用cmd命令执行,获取 stdout内容,你可以同时调用这三个,
来自酷炫的 CNodeMD
@zswnew 按照这种思路,问题变成在js中如何获取三个child process的调用结果,用promise.all么?那结果又回到串行了。。
@daben0701 谁说 all 是串行
@atian25 就我理解all就是在队列中串行执行的,并且我也试过了用all和依次执行时间基本一致。 如何我理解的有问题,请指正。
既然是 C/C++ 的话,可以通过 libuv 提供的 uv_work 方法来将方法改为异步通过线程池执行。JavaScript 层面通过 Promise.all() 来进行并发调度就可以。
@JacksonTian 目前我已经全部通过child_process改为多进程了,但是promise.all是通过new promise的顺序来先后执行的,又把我难住了。。
最好是改动 C/C++ 代码,进程的模型开销很大的,除非只是单次运行。如果多次运行的话,进程的创建/销毁对 load 是有很大的影响的。
new worker(…)
@JacksonTian 嗯,确实开销很大,先用js实现了再考虑去改底层C++的代码。