日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
我們一起對(duì)Node.Js一問(wèn)一答

本文轉(zhuǎn)載自微信公眾號(hào)「編程雜技」,作者theanarkh。轉(zhuǎn)載本文請(qǐng)聯(lián)系編程雜技公眾號(hào)。

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比福田網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式福田網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋福田地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

一問(wèn)一答是以問(wèn)答的形式聊一下 Node.js 的一個(gè)個(gè)知識(shí)點(diǎn)。

1 setTimeout 和 setImmediate

setTimeout(() => {}, 0) 和 setImmediate 誰(shuí)先執(zhí)行,這個(gè)是 Node.js 里經(jīng)常會(huì)被提到的一個(gè)問(wèn)題,其實(shí)這兩沒(méi)什么關(guān)系,setImmediate 是 Node.js check 階段的任務(wù),setTimeout 是 timer 階段的任務(wù),在 Node.js 事件循環(huán)中,timer 階段是在 check 階段執(zhí)行的,看起來(lái) setTimeout 的回調(diào)肯定比 setImmediate 的回調(diào)先執(zhí)行,但是 Node.js 的實(shí)現(xiàn)中規(guī)定了 setTimeout 的超時(shí)時(shí)間最小是 1,這就導(dǎo)致了事件循環(huán)開(kāi)始時(shí),定時(shí)器可能到期也可能不到期的情況,所以誰(shuí)先執(zhí)行是不一定的。下面是示例代碼。

 
 
 
 
  1. setTimeout(() => {
  2.     console.log('setTimeout')
  3. }, 0);
  4. setImmediate(() => {
  5.     console.log('setImmediate')
  6. });

2 瀏覽器和 Node.js 的 setInterval 有什么區(qū)別

在前端的時(shí)候,我們經(jīng)常會(huì)輪詢接口或定時(shí)去做一些事情,但是我們一般不使用 setInterval,因?yàn)闉g覽器中, setInterval 是用單獨(dú)的線程實(shí)現(xiàn)的,當(dāng)任務(wù)超市時(shí),定時(shí)線程就會(huì)往 JS 線程追加一個(gè)回調(diào)任務(wù)。哪怕 JS 線程阻塞了,也不影響定時(shí)線程往 JS 線程里追加任務(wù)。如果 JS 線程在運(yùn)行一段耗時(shí)的代碼,定時(shí)線程就會(huì)往 JS 線程里追加很多回調(diào)任務(wù),導(dǎo)致耗時(shí)代碼執(zhí)行完后,大量回調(diào)被執(zhí)行,比如短期內(nèi)大量的輪詢接口請(qǐng)求,這并不是我們預(yù)期的效果。所以這種場(chǎng)景下一般使用 setTimeout 里調(diào)用 setTimeout 去模擬 setInterval。但在 Node.js 里就不會(huì)存在這個(gè)問(wèn)題,首先 Node.js 定時(shí)器不是單獨(dú)線程實(shí)現(xiàn)的,然后當(dāng) setInterval 的回調(diào)被執(zhí)行時(shí),才會(huì)開(kāi)始開(kāi)始下一輪的計(jì)時(shí)。下面是 Node.js 中的實(shí)現(xiàn),我們可以看到執(zhí)行回調(diào)前會(huì)重新獲取當(dāng)前時(shí)間為下一輪開(kāi)始時(shí)間,然后重新插入數(shù)據(jù)結(jié)構(gòu)中。

3 如何在 Node.js 里監(jiān)聽(tīng)一個(gè)隨機(jī)端口

在某些場(chǎng)景下,我們可能需要監(jiān)聽(tīng)一個(gè)隨機(jī)的端口,在 Node.js 里我們可以這樣做

 
 
 
 
  1. const server  = net.createServer()
  2. .listen(() => {
  3.     console.log(server.address());
  4. })

但是這種方式存在一個(gè)問(wèn)題是在 cluster 模塊下無(wú)法正常工作,比如我們希望在每一個(gè)進(jìn)程里監(jiān)聽(tīng)不同的隨機(jī)端口,那么在子進(jìn)程里執(zhí)行 listen 的時(shí)候,不管是使用 cluster 的哪種模式都會(huì)導(dǎo)致多個(gè)進(jìn)程監(jiān)聽(tīng)同一個(gè)端口,解決方案就是使用 exclusive 標(biāo)記。

 
 
 
 
  1. const server  = net.createServer()
  2. .listen({ port: 0, exclusive: true }, () => {
  3.     console.log(server.address());
  4. })

exclusive 指示 Node.js 不共享監(jiān)聽(tīng)端口,而是每次都監(jiān)聽(tīng)一個(gè)新的端口,至于為啥要穿 port 等于 0,因?yàn)?Node.js 里的邏輯就是這樣的。


網(wǎng)頁(yè)名稱:我們一起對(duì)Node.Js一問(wèn)一答
網(wǎng)頁(yè)路徑:http://m.5511xx.com/article/cdcjdhj.html