2015-10-11 105 views
2

我试图连接到第三方库,它具有可以阻止的功能。我想使用它,但没有阻塞。是否有可能包装一个我无法控制的阻止呼叫,使其成为异步?观看阻止呼叫nodejs

// calling this function will block the nodejs thread 
blockingCall(); 

我想是这样的。

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

这可能吗?这有意义吗?

+0

我不知道你在做什么,但我建议你不要这样做。如果你想在同步调用之后发生一些事情,在它后面放置一个语句。我不完全确定你为什么要'观看'同步通话。我们可能需要关于您正在使用的图书馆的更多信息,或者您正面临的问题(而不是您想要的)。 –

+0

所以,问题是,客户端库是一个多线程的C库,我已经为它做了一个nodejs包装。因为它的工作方式,它要求客户端(nodejs)提供一个阻塞调用,而它自己则调用客户端中的一个函数(nodejs),这将导致第一次调用解除阻塞。因为节点是单线程的,这只是一个僵局。我想知道是否可以解决这个问题,将c调用转换为异步调用,然后将所有逻辑放在回调函数中。我希望这是有道理的 – 6D65

+0

你不会通过把它放在回调中来使异步代码异步。您只需延迟阻塞呼叫,直到下一个事件打勾。考虑产生一个子进程,并等待它完成或使用光纤,如果一切都失败。 –

回答

2

无法在Node.js中创建阻塞的JavaScript代码非阻塞 - 节点用于其非阻塞行为的机制在C/C++层中实现,而该层仅在执行I/O操作(从磁盘读取,网络连接等)。

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

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

注:

阅读您的问题下方的意见后,似乎你是真正的闭锁功能,进而调用一个C API执行阻塞I/O的作者。有很多方法可以调用C函数,这些函数通常会阻止不阻止上层JavaScript层的方式。虽然我不是C专家,但我认为这是使用Node中包含的libuv库完成的 - 请参阅addons文档以获取更多信息。

+0

好的信息。从来没有试图自己做这样的事情,但我总是假设任何外部/本地库将在一个单独的线程中执行。 – nick

+0

关于性能影响,虽然我可以考虑使用外部C/C++代码的唯一原因是相对较重的计算操作(也许是crypto),但node.js可能不是最佳选择。 – nick

+0

我提到的性能影响是每次需要调用函数时产生一个新进程。使用C/C++插件也会有一些性能影响(您的代码需要跨语言传递值),但它相对较小。 –