Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 监视阻塞呼叫节点_Node.js_Asynchronous_Blocking_Nonblocking - Fatal编程技术网

Node.js 监视阻塞呼叫节点

Node.js 监视阻塞呼叫节点,node.js,asynchronous,blocking,nonblocking,Node.js,Asynchronous,Blocking,Nonblocking,我正在尝试连接到第三方库,该库具有可以阻止的功能。我想使用它,但不阻塞。是否可以包装一个我无法控制的阻塞调用,使其异步 // calling this function will block the nodejs thread blockingCall(); 我想要的是这样的东西 // wrapper for the blocking call var wrapper = wrapBlockingCall(blockingCall); wrapper.on('complete', functi

我正在尝试连接到第三方库,该库具有可以阻止的功能。我想使用它,但不阻塞。是否可以包装一个我无法控制的阻塞调用,使其异步

// calling this function will block the nodejs thread
blockingCall();
我想要的是这样的东西

// wrapper for the blocking call
var wrapper = wrapBlockingCall(blockingCall);
wrapper.on('complete', function() {});

这可能吗?这有意义吗?

在Node.js中无法使阻塞JavaScript代码无阻塞-节点用于其无阻塞行为的机制在C/C++层中实现,而C/C++层仅在执行I/O操作(从磁盘读取、联网等)时使用

实际上,您的程序使用的每一行JavaScript都将一行一行地执行,因为无论您做什么,它总是在同一个线程上执行

我看到的唯一选项是使用内置模块在单独的节点进程中执行有问题的代码。然而,这将对性能产生重大影响,如果代码需要频繁执行,影响甚至更大

注意:

在阅读了您的问题下的注释之后,似乎您实际上是blocking函数的作者,该函数反过来调用执行blocking I/O的C API。有几种调用C函数的方法,这些函数通常会以不阻塞上层JavaScript层的方式进行阻塞


虽然我不是C专家,但我认为这是通过使用Node中包含的libuv库实现的-请查看文档以了解更多信息。

我不知道您在做什么,但我建议您不要这样做。如果希望在同步调用之后发生某些事情,请在其后面放置一条语句。我不完全确定您为什么要“观看”同步呼叫。我们可能需要更多关于您正在使用的库或您面临的问题的信息(不是您想要做的)。因此,问题是,客户端库是一个多线程c库,我为它制作了一个nodejs包装器。因为它的工作方式,它需要客户端(nodejs)执行阻塞调用,而它本身调用客户端(nodejs)中的一个函数,这将导致取消阻塞第一个调用。由于节点是单线程的,所以这只是一个死锁。我想知道是否可以绕过这个问题,将c调用转换为异步调用,然后将所有逻辑放在回调中。我希望这是有意义的,因为您不会将同步代码放在回调中而使其异步。您将只是延迟阻塞调用,直到下一个事件发生。考虑产卵过程,并等待它完成或使用纤维,如果所有其他故障。它开始有意义。安装光纤,制作光纤包裹阻塞呼叫。虽然它似乎没有一个事件发射器接口,但这将允许我在光纤结束时执行一些其他代码。在阻塞调用之后,它实际上会将依赖的代码放入光纤中。请你回答这个问题,我会接受的。好消息。我本人从未尝试过这样做,但我总是假设任何外部/本机LIB都将在单独的线程中执行。不过,关于性能影响,我能想到的使用外部C/C++代码的唯一原因是用于相对繁重的计算操作(可能是加密),node.js可能不是最佳选择。我提到的性能影响是每次需要调用函数时都会产生一个新进程。使用C/C++插件也会对性能产生一些影响(代码需要跨语言传递值),但影响相对较小。