2015-10-11 103 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++插件也會有一些性能影響(您的代碼需要跨語言傳遞值),但它相對較小。 –