我尝试连接到第三方库,该库具有可以阻止的功能。我想使用它,但没有阻止。是否可以包含一个我无法控制的阻止呼叫,使其成为异步?
// calling this function will block the nodejs thread
blockingCall();
我想要的是这样的。
// wrapper for the blocking call
var wrapper = wrapBlockingCall(blockingCall);
wrapper.on('complete', function() {});
这可能吗?这有意义吗?
答案 0 :(得分:2)
没有办法在Node.js中阻塞JavaScript代码非阻塞 - Node用于其非阻塞行为的机制是在C / C ++层实现的,而C / C ++层只在我执行时才使用/ O操作(从磁盘,网络等读取)。
实际上,程序使用的每一行JavaScript都将逐个执行,因为它总是在同一个线程上执行,无论你做什么。
我看到的唯一选择是使用内置的Child Process模块在单独的Node进程中执行有问题的代码。但是,如果代码需要经常执行,这将产生重大的性能影响,甚至更大的影响。
注意:强>
在阅读了您的问题后的评论后,您似乎实际上是阻塞函数的作者,而阻塞函数又调用了执行阻塞I / O的C API。有一些方法可以调用C函数,这些函数通常会以不阻塞上层JavaScript层的方式进行阻塞。
虽然我不是C专家,但我认为这是使用Node中包含的 libuv 库完成的 - 有关详细信息,请查看addons文档。