簡體   English   中英

為 nodeJS(或瀏覽器)創建異步 api

[英]Creating an asychroneous api for nodeJS (or browser)

大多數 NodeJS 程序員都知道為什么阻塞 NodeJS 的單線程事件循環是不好的。 例如,在讀取文件時,我們知道最好使用 fs.readFile 而不是 fs.readFileSync。 我的問題是:如果 API 執行的底層任務本質上是同步的,那么首先如何創建異步 API? 換句話說,我如何去創建一個 API,比如 fs.readFileSync,而不是使用事件循環線程來執行底層任務? 我是否必須離開 NodeJS 和 Javascript 才能做到這一點?

如果 API 執行的底層任務本質上是同步的,那么首先如何創建異步 API?

在 node.js 中,創建自己的異步操作有以下選擇:

  1. 它基於現有的異步操作(例如fs.readFile() )。 如果你的主操作本身是同步的,只能在 node.js 中同步完成,那么這個選項顯然不能解決你的問題。
  2. 使用setTimeout()setImmediate()nextTick()將您的代碼分成小塊,以便其他事物可以與您的操作交錯,並且您不會阻止其他事物共享 CPU。 這不會阻止 CPU 使用,但它允許與其他操作共享 CPU。 這是一個以塊為單位迭代數組的示例,該示例不會阻止其他操作共享 CPU: Best way to iterate over an array without blocks UI
  3. 將您的同步操作移到另一個可以執行其操作的進程(另一個 node.js 進程或任何其他進程)中,然后在使用任何適當的進程間通信機制(TCP、stdio 等)完成后異步通信。
  4. 編寫一個 node.js 插件,您可以在其中使用本機操作系統線程或本機 IO 事件,然后您可以在具有異步接口的 node.js 中創建新操作。

我是否必須離開 NodeJS 和 Javascript 才能做到這一點?

上面的第 #1、#2、#3 項都可以通過 Javascript 完成。 第 4 項涉及創建本機代碼插件(您可以在其中訪問本機線程)。

換句話說,我如何去創建一個 API,比如 fs.readFileSync

要真正從頭開始創建像fs.readFileSync()這樣的 API,您必須使用選項 #3(同步執行,但在另一個進程中,然后異步返回結果)或選項 #4(訪問 OS 服務)低於通過本機代碼插件內置到 node.js 中的級別)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM