久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      nodejs是單進(jìn)程的嗎

      nodejs是單進(jìn)程。Node遵循的是單線程單進(jìn)程的模式,但其基于事件驅(qū)動、異步非阻塞模式,可以應(yīng)用于高并發(fā)場景,避免了線程創(chuàng)建、線程之間上下文切換所產(chǎn)生的資源開銷。

      nodejs是單進(jìn)程的嗎

      本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版、Dell G3電腦。

      進(jìn)程

      進(jìn)程 Process 是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ),進(jìn)程是線程的容器 (來自百科) 。進(jìn)程是資源分配的最小單位。我們啟動一個服務(wù)、運行一個實例,就是開一個服務(wù)進(jìn)程,例如 Java 里的 JVM 本身就是一個進(jìn)程,Node.js 里通過 node app.js 開啟一個服務(wù)進(jìn)程,多進(jìn)程就是進(jìn)程的復(fù)制 (fork) ,fork 出來的每個進(jìn)程都擁有自己的獨立空間地址、數(shù)據(jù)棧,一個進(jìn)程無法訪問另外一個進(jìn)程里定義的變量、數(shù)據(jù)結(jié)構(gòu),只有建立了 IPC 通信,進(jìn)程之間才可數(shù)據(jù)共享。

      線程

      線程是操作系統(tǒng)能夠進(jìn)行運算調(diào)度的最小單位,首先我們要清楚線程是隸屬于進(jìn)程的,被包含于進(jìn)程之中。 一個線程只能隸屬于一個進(jìn)程,但是一個進(jìn)程是可以擁有多個線程的。 單線程 單線程就是一個進(jìn)程只開一個線程 Javascript 就是屬于單線程,程序順序執(zhí)行(這里暫且不提JS異步),可以想象一下隊列,前面一個執(zhí)行完之后,后面才可以執(zhí)行,當(dāng)你在使用單線程語言編碼時切勿有過多耗時的同步操作,否則線程會造成阻塞,導(dǎo)致后續(xù)響應(yīng)無法處理。你如果采用 Javascript 進(jìn)行編碼時候,請盡可能的利用 Javascript 異步操作的特性。

      nodejs單進(jìn)程單線程事件驅(qū)動

      Node遵循的是單線程單進(jìn)程的模式,node的單線程是指js的引擎只有一個實例,且在nodejs的主線程中執(zhí)行,同時node以事件驅(qū)動的方式處理IO等異步操作。node的單線程模式,只維持一個主線程,大大減少了線程間切換的開銷,但是會有多個worker線程,用于執(zhí)行異步操作。

      但是node的單線程使得在主線程不能進(jìn)行CPU密集型操作,否則會阻塞主線程。對于CPU密集型操作,在node中通過 child_process 可以創(chuàng)建獨立的子進(jìn)程,父子進(jìn)程通過IPC通信,子進(jìn)程可以是外部應(yīng)用也可以是node子程序,子進(jìn)程執(zhí)行后可以將結(jié)果返回給父進(jìn)程。

      Node.js的運行機制

      • V8引擎解析JavaScript腳本。
      • 解析后的代碼,調(diào)用Node API。
      • libuv庫負(fù)責(zé)Node API的執(zhí)行。它將不同的任務(wù)分配給不同的worker線程,形成一個Event Loop(事件循環(huán)),以異步的方式將任務(wù)的執(zhí)行結(jié)果返回給V8引擎。
      • V8引擎再將結(jié)果返回給用戶。
        nodejs是單進(jìn)程的嗎

      這個圖是整個 Node.js 的運行原理,從左到右,從上到下,Node.js 被分為了四層,分別是 應(yīng)用層、V8引擎層、Node API層 和 LIBUV層。

      • 應(yīng)用層: 即 JavaScript 交互層,常見的就是 Node.js 的模塊,比如 http,fs
      • V8引擎層: 即利用 V8 引擎來解析JavaScript 語法,進(jìn)而和下層 API 交互
      • NodeAPI層: 為上層模塊提供系統(tǒng)調(diào)用,一般是由 C 語言來實現(xiàn),和操作系統(tǒng)進(jìn)行交互 。
      • LIBUV層: 是跨平臺的底層封裝,實現(xiàn)了 事件循環(huán)、文件操作等,是 Node.js 實現(xiàn)異步的核心

      Node.js 事件循環(huán)

      Node.js 通常情況下是單進(jìn)程的。

      • 主線程運行 V8 和 Javascript
      • 多個子線程通過 事件循環(huán) 被調(diào)度

      事件循環(huán):

      事件循環(huán)是一種編程構(gòu)造,用于等待和分派程序中的事件或消息, 主線程從"任務(wù)隊列"中讀取事件,這個過程是循環(huán)不斷的,所以整個的這種運行機制又稱為Event Loop(事件循環(huán))

      事件隊列:

      當(dāng)用戶的網(wǎng)絡(luò)請求或者其它的異步操作到來時,node都會把它放到Event Queue之中,此時并不會立即執(zhí)行它,代碼也不會被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢。

      任務(wù)隊列:

      任務(wù)隊列"是一個事件的隊列(也可以理解成消息的隊列),IO設(shè)備完成一項任務(wù),就在"任務(wù)隊列"中添加一個事件,表示相關(guān)的異步任務(wù)可以進(jìn)入"執(zhí)行棧"了。主線程讀取"任務(wù)隊列",就是讀取里面有哪些事件。

      事件驅(qū)動:

      實質(zhì)是通過主循環(huán)加事件觸發(fā)方式運行程序
      node
      Node.js 不是一門語言也不是框架,它只是基于 Google V8 引擎的 JavaScript 運行時環(huán)境,是對 js 功能的拓展。提供了網(wǎng)絡(luò)、文件、dns 解析、進(jìn)程線程等功能。

      libuv
      libuv是專門為Node.js開發(fā)的一個封裝庫,提供跨平臺的異步I/O能力。

      注意:

      • 一個事件循環(huán)有一個或多個任務(wù)隊列。一個任務(wù)隊列是一組的任務(wù)

      • Libuv 主要是,利用系統(tǒng)提供的事件驅(qū)動模塊解決網(wǎng)絡(luò)異步 IO,利用線程池解決文件IO。另外還實現(xiàn)了定時器,對進(jìn)程、線程等使用進(jìn)行了封裝。

      其實這里的事件循環(huán)和js在瀏覽器的事件循環(huán)是一樣的,主線程允許同步代碼,異步代碼放到對應(yīng)的工作線程中執(zhí)行,回調(diào)執(zhí)行結(jié)果后放進(jìn)事件隊列,待主線程執(zhí)行事件隊列的任務(wù)。

      事件驅(qū)動+事件循環(huán)實現(xiàn)高并發(fā)

      具體執(zhí)行順序:

      1、每個Node.js進(jìn)程只有一個主線程在執(zhí)行程序代碼,形成一個執(zhí)行棧(execution context stack)

      2、主線程之外,還維護了一個"事件隊列"(Event queue)。當(dāng)用戶的網(wǎng)絡(luò)請求或者其它的異步操作到來時,node都會把它放到Event Queue之中,此時并不會立即執(zhí)行它,代碼也不會被阻塞,繼續(xù)往下走,直到主線程代碼執(zhí)行完畢。

      3、主線程代碼執(zhí)行完畢完成后,然后通過Event Loop,也就是事件循環(huán)機制,開始到Event Queue的開頭取出第一個事件,從線程池中分配一個線程去執(zhí)行這個事件,接下來繼續(xù)取出第二個事件,再從線程池中分配一個線程去執(zhí)行,然后第三個,第四個。主線程不斷的檢查事件隊列中是否有未執(zhí)行的事件,直到事件隊列中所有事件都執(zhí)行完了,此后每當(dāng)有新的事件加入到事件隊列中,都會通知主線程按順序取出交EventLoop處理。當(dāng)有事件執(zhí)行完畢后,會通知主線程,主線程執(zhí)行回調(diào),線程歸還給線程池。

      注意

      我們所看到的node.js單線程只是一個js主線程與ui渲染共享一個線程,本質(zhì)上的異步操作還是由線程池完成的,node將所有的阻塞操作都交給了內(nèi)部的線程池去實現(xiàn),本身只負(fù)責(zé)不斷的往返調(diào)度,并沒有進(jìn)行真正的I/O操作,從而實現(xiàn)異步非阻塞I/O,這便是node單線程和事件驅(qū)動的精髓之處了。

      總結(jié):

      1、libuv 線程池默認(rèn)打開 4 個,最多打開 128個 線程。(例如:以前 web 服務(wù)器同一時間比如說最多只能接收 100 個請求,多的就無法接收了,服務(wù)器就掛掉了。nodejs 所謂的高并發(fā)是指可以同時接收 1000、10000 個請求,只不過以排隊的方式在等待。

      2、主線程執(zhí)行js,是單線程的,js代碼在做大量計算就是cpu密集了。主線程不空閑出來也沒法處理 io 的事,所以就會阻塞了。

      3、回調(diào)只能保證某個請求按照順序執(zhí)行,不能保證多個請求訪問一個資源的先后順序,多個請求訪問一個資源是要加鎖的,用事務(wù)加鎖就行。

      【推薦學(xué)習(xí):《nodejs 教程》】

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號