如何才能在nodejs中实现类似真正的并行来减少程序运行时间?
发布于 6 年前 作者 daben0701 4852 次浏览 来自 问答

代码如下:

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,求指教:能不能通过并发提高速度呢?

17 回复

有个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不用单独写c++,文件,直接单独写个js文件,来调用

来自酷炫的 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++的代码。

回到顶部