js worker 个人使用教程
worker來(lái)源
總說(shuō)周知,js是一門(mén)單線程的語(yǔ)言,簡(jiǎn)單的來(lái)說(shuō),可以吧線程想象瀏覽器背后的小人,這個(gè)小人可不得了,專門(mén)干的活就是運(yùn)行js代碼,如果條件允許,它可以整天整夜24小時(shí)不停的轉(zhuǎn),比那些什么996,007厲害多了。這小人干的活就是對(duì)一段段代碼進(jìn)行解釋,流程大概是從上到下,從左到右,根據(jù)每一行的代碼去執(zhí)行對(duì)應(yīng)的操作。但是也說(shuō)了,線程相當(dāng)于小人,js單線程,可以推出瀏覽器后面只有一個(gè)小人干活(哇,多么嚴(yán)謹(jǐn)?shù)耐茢?#xff09;。
有人有疑問(wèn)??
那小人這么牛逼,為什么瀏覽器就只雇傭了一個(gè)小人呀,搞個(gè)幾十個(gè)不是厲害死了?
這。。。
好像很有道理,但是為什么瀏覽器只有一個(gè)小人呢,這其實(shí)和js被創(chuàng)建之初的用途來(lái)決定。想當(dāng)初,全世界的網(wǎng)頁(yè)都還是這么的單純,除了html就是css,哪里有這么多的花里胡哨,但是總有那么些天才就在想,我這靜態(tài)頁(yè)面也不好看呀,一點(diǎn)驚喜也沒(méi)有。我想要多一點(diǎn)效果,比如這一行字變成紅色,那個(gè)框要隱藏起來(lái),這個(gè)按鈕我要點(diǎn)擊前扭一下屁股,我要網(wǎng)站背景上動(dòng)態(tài)顯示自己的24小時(shí)不間斷的帥照。這,這。。如果當(dāng)初想要做到這些,還不如打產(chǎn)品經(jīng)理一頓來(lái)的實(shí)際。
后來(lái)呀,出現(xiàn)一位DL,花了十幾天時(shí)間搗鼓出一個(gè)東西,這個(gè)東西做出來(lái)就是為了一件事,UI交互-----接受用戶輸入,操作DOM,這決定了它只能是單線程的,否則可以想象如果多線程的話,就是很多小人,每個(gè)小人都嚷嚷著對(duì)于一個(gè)DOM的內(nèi)容進(jìn)行修改,那你說(shuō)聽(tīng)誰(shuí)的,這就會(huì)造成混亂。所以單線程它不香嗎?每個(gè)程序員在給變量起名的時(shí)候可能見(jiàn)識(shí)過(guò)起名是多么困難的意見(jiàn)事情,所以DL對(duì)搗鼓出來(lái)的東西起名的時(shí)候想了半天想不出個(gè)所以然,想象java這時(shí)候還挺火的,要不叫JavaScript,可以蹭蹭熱度? java和JavaScript的區(qū)別差不多是 周杰和周杰倫的區(qū)別(這一段我胡扯的)
又有人有疑問(wèn)??
就一個(gè)小人,就一個(gè)小人在干活,我又要操作DOM,又要發(fā)起請(qǐng)求,又要處理字符串,那會(huì)不會(huì)活趕不過(guò)來(lái)導(dǎo)致頁(yè)面卡頓??
如果說(shuō)單線程是js的特點(diǎn),那么另外一個(gè)特點(diǎn)一定是異步了。在小人執(zhí)行的代碼中,大概可以分為兩種,同步代碼和異步代碼(講了句廢話)。如果要解釋的話有幾個(gè)點(diǎn)需要說(shuō)明一下,
第一點(diǎn)、對(duì)于小人來(lái)說(shuō),執(zhí)行同步代碼是很快,超級(jí)快,特別是V8引擎(小人中的超人))出來(lái)后,那速度和超人差不多。
第二點(diǎn)、 小人不是在執(zhí)行代碼,就是在等待執(zhí)行代碼的路上
第三點(diǎn)、 同步異步代碼其實(shí)都是指代碼(廢話石錘)
? ? ?其實(shí)異步解決最大問(wèn)題并不是代碼執(zhí)行時(shí)間太長(zhǎng)的的問(wèn)題,而是IO,IO是個(gè)啥,IO其實(shí)包含且不止文件讀取,網(wǎng)絡(luò)請(qǐng)求。。。等等,比如一個(gè)網(wǎng)絡(luò)請(qǐng)求,我們最熟悉的ajax請(qǐng)求,代碼的話只有一句,$.ajax(url)?就完事了,代碼執(zhí)行完了,但是從代碼運(yùn)行完-瀏覽器發(fā)起請(qǐng)求-服務(wù)器接收請(qǐng)求-服務(wù)器返回響應(yīng),這些流程都是需要時(shí)間,而且相對(duì)于代碼執(zhí)行時(shí)間來(lái)說(shuō)長(zhǎng)的多了,而我們發(fā)起請(qǐng)求,那肯定是為了獲取數(shù)據(jù)并對(duì)數(shù)據(jù)做一定的處理,小人在處理這一句“$.ajax(url)?”的時(shí)候,我們是想要拿到服務(wù)器返回的數(shù)據(jù)的,所以現(xiàn)在小人有兩個(gè)選擇:1、等,等服務(wù)器給我數(shù)據(jù),我再繼續(xù)干別的活,2、我先給這句代碼做個(gè)標(biāo)記,等服務(wù)器返回?cái)?shù)據(jù)了,我再接著干,現(xiàn)在先去干別的事。這其實(shí)是對(duì)異步最樸素的理解吧。
所以小人 干活的時(shí)間 = 執(zhí)行代碼的時(shí)間+IO等待時(shí)間??,所以有了v8(超人)解決了代碼執(zhí)行速度的問(wèn)題,而異步又解決了IO等待的時(shí)間(這其實(shí)是轉(zhuǎn)化為了代碼執(zhí)行時(shí)間),而且小人干活并不是24小時(shí)連續(xù)不間斷的執(zhí)行代碼(很重要),除非你在24小數(shù)不間斷的刷新DOM,不間斷的進(jìn)行用戶輸入。所以相對(duì)于前端UI分分鐘來(lái)個(gè)2、3秒的loading來(lái)說(shuō),V8(超人)執(zhí)行代碼的速度?一般??可以到毫秒級(jí),可以忽略不計(jì)。
講了大半天,這時(shí)候有人就問(wèn),上面都說(shuō)了超人很厲害,那還要worker干嘛,這時(shí)候又要了解另一個(gè)概念了:就是在V8(超人)在執(zhí)行代碼的時(shí)候,頁(yè)面UI是阻塞的,阻塞就是外在表現(xiàn)為頁(yè)面卡主了,動(dòng)不了,鼠標(biāo)不響應(yīng),這是正常的的。因?yàn)橹挥幸粋€(gè)小人,而一個(gè)人在一個(gè)時(shí)刻只能干一件事。所以當(dāng)小人一直在執(zhí)行代碼時(shí)候,頁(yè)面就會(huì)一直卡頓,“你不是說(shuō)很快嘛?”有人問(wèn)到,其實(shí)快也是相對(duì)而言的。因?yàn)槿绻鹙s做一些計(jì)算密集型的運(yùn)算時(shí)候,還是會(huì)捉襟見(jiàn)肘。
所以這個(gè)時(shí)候這時(shí)候worker就出現(xiàn)了。。。。
worker就字面意思來(lái)說(shuō)“工作者”,或者叫 "打工人'。那真是一個(gè)慘字了得。太晚了,改天在寫(xiě)關(guān)于worker的內(nèi)容。。。。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的js worker 个人使用教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微型计算机中i3或i5一般指的是,酷睿i
- 下一篇: Excel 使用ODBC直接访问