鍍金池/ 問答/HTML/ Nodejs的express框架中當前路由可能會阻塞主線程。

Nodejs的express框架中當前路由可能會阻塞主線程。

環(huán)境:是這樣的,我用nodejs的express框架搭建了一個web服務(wù)器。

有一個路由:/download
1.路由中執(zhí)行了一條SQL語句,這條語句并不復(fù)雜只需幾百毫秒就執(zhí)行完成了。
但是這條SQL查詢出來的數(shù)據(jù)比較多,大概有3萬來條。
2.SQL語句執(zhí)行完后把返回的數(shù)據(jù)(JSON格式)利用路由返給前端頁面,也就是下載這個SQL查詢出來的數(shù)據(jù)。這里用插件把JSON轉(zhuǎn)成了xlsx后再下載。


結(jié)果:
由于數(shù)據(jù)較多,從查詢完到彈出下載框的時間很行。大概在20秒左右。
在這期間,其它路由是無法訪問的,必需要等到這個路由返回完成。阻塞住了!
如果用setTimeout的方式延時res.send()是不影響其它路由的,也就是說并不是路由阻塞了主線程,而是這個JSON轉(zhuǎn)二進制的過程阻塞了主線程。
我嘗試過,如果不轉(zhuǎn)二進制,只在循環(huán)里打印SQL的結(jié)果(console.log())同樣是阻塞的,這不禁讓我懷疑console.log是同步的???


問題:
1.console.log是同步的?
2.如果解決這種大量數(shù)據(jù)的導(dǎo)出呢?

回答
編輯回答
愛是癌

console.log 當然是同步的,你難道以為 everything 都是異步嗎。
大量數(shù)據(jù)的導(dǎo)出使用stream流的形式。
你所說的路由阻塞了,如果不同的路由是毫不相關(guān)的,憑什么一個會阻塞另一個,你代碼寫的有問題吧。

2018年7月25日 16:24
編輯回答
寫榮

fork一個子進程去處理數(shù)據(jù)比較大的這部分工作應(yīng)該會緩解一下主線程壓力。

2018年5月17日 17:39
編輯回答
柒槿年

nodejs是單線程吧.

2017年8月30日 22:42
編輯回答
墨染殤

從描述看來阻塞是來自于服務(wù)器的復(fù)雜運算導(dǎo)致其他請求響應(yīng)變慢了。對于REST來說API的數(shù)據(jù)請求過大就算服務(wù)端不卡死客戶端也會相應(yīng)超慢,單一數(shù)據(jù)過大會嚴重拖慢響應(yīng)速度。比較妥善的辦法是將API拆分分發(fā)數(shù)據(jù),比如一次200條(根據(jù)你的數(shù)據(jù)模型復(fù)雜度來定),發(fā)送多次請求獲得完整數(shù)據(jù)

2018年6月9日 21:37