日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何查找历史线程阻塞原因_学习 Web Worker(js中的“多线程”)

發布時間:2023/12/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何查找历史线程阻塞原因_学习 Web Worker(js中的“多线程”) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天部門例會,討論開發的系統遇到的問題,遇到一個醫保上傳比較耗時的問題,解決方案提到了Web Worker,學習一波。

首先簡單介紹一下什么是web worker。我們都知道在瀏覽器中javascript的執行是單線程的,頁面上的javascript在執行時會阻塞瀏覽器的響應,這非常影響用戶體驗,所以ajax應運而生了。ajax的出現使得頁面在等待服務器響應的這段時間內不再發生阻塞,但是這仍然沒有改變代碼單線程執行的本質,這也意味著我們依舊不能把耗費時間的復雜運算放在頁面上執行。而web worker的出現彌補了這個缺點。

頁面上單線程執行的javascript是主線程(我們通常寫的javascript都在主線程中執行),new出來的web worker對象為子線程,只有主線程中的代碼執行時會導致阻塞,子線程則不會,這表示部分耗費時間的復雜運算完全可以從后臺挪到前臺來完成。

web worker的定義就不再這里贅述了,對web worker還不了解的同學可以在MDN上去了解。

下面給出一個簡單的web worker例子來驗證一下子線程的執行是否對頁面有影響:

index.html代碼:

<!DOCTYPE html> <html> <body> <p>Count numbers: <output id="result"></output></p> <button onclick="startWorker()">Start Worker</button> <button onclick="stopWorker()">Stop Worker</button> <input type="text" value=""/> <script> var w; function startWorker () {if (typeof(Worker) !== "undefined") {if (typeof(w) === "undefined") {w = new Worker("demo_workers.js");}w.onmessage = function (event) {document.getElementById("result").innerHTML = event.data;};} else {document.getElementById("result").innerHTML = "Sorry, your browser does not support Web Workers...";} }function stopWorker () {w.terminate(); } </script> </body> </html>

demo_workers.js代碼:

function timedCount () {for (var i = 0; i < 10000000000; i++) {if (i % 100000 === 0) {postMessage(i);}} }timedCount();

點擊Start Worker按鈕啟動web worker,可以看到web worker開始工作,且在web worker正常工作時,我們仍然可以在input輸入框中輸入信息,這表示頁面并沒有因為web worker的運行而被阻塞:

另外要注意一點,web worker雖然是新啟動的子線程,運行不會阻塞頁面,但與主線程的交互會,以上面的代碼為例,如果在web worker的for循環里面直接調用postMessage,仍然會感到頁面的操作不夠流暢(原因是主線程需要一直不停地處理子線程post過來的消息)。

web worker的介紹至此結束,接下來聊一聊web worker的應用場景。目前可以百度到的關于web worker的文章內容大部分都是從MDN復制過來的,極少有介紹在實際項目中是如何使用web worker的,當然,按筆者的理解有兩方面的原因:

一、web worker的兼容性問題,主流瀏覽器對web worker的兼容性還不夠高(比如Safari ,IE就更不用說了);

二、在項目中引入web worker并不能帶來質的改變(從這一點來說,websocket就不一樣,引入websocket后基本可以替換掉項目里所有的輪詢,達到性能優化的目的,但正常的項目決不可能設計成讓前臺來處理復雜的業務邏輯)。

當然,這也不表示web worker毫無用武之地,比如下面幾個場景:

大數據的處理:
這里所說的大數據處理,并不是指數據量非常大,而是要從計算量來看,通常用時不能控制在毫秒級內的運算都可以考慮放在web worker中執行。

高頻的用戶交互:
高頻的用戶交互適用于根據用戶的輸入習慣、歷史記錄以及緩存等信息來協助用戶完成輸入的糾錯、校正功能等類似場景,用戶頻繁輸入的響應處理同樣可以考慮放在web worker中執行。

最后聲明一點,了解后臺的同學千萬不要認為web worker等同于后臺意義的多線程,web worker現在有了多線程的形(有了多線程的用法),但還不具備多線程的神(不具備線程通信、鎖等后臺線程的基本特性),web worker的本質是支持我們把數據刷新與頁面渲染兩個動作拆開執行(不使用web worker的話這兩個動作在主線程中是線性執行的)。

作者: 討厭走開啦
鏈接:https://blog.csdn.net/lqlqlq007/article/details/79824122
來源: CSDN

總結

以上是生活随笔為你收集整理的如何查找历史线程阻塞原因_学习 Web Worker(js中的“多线程”)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。