亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

變量上的 JavaScript 事件循環操作是否阻塞?

變量上的 JavaScript 事件循環操作是否阻塞?

繁星coding 2022-06-09 19:01:37
在 JavaScript 的非阻塞事件循環中,讀取然后更改變量是否安全?如果兩個進程幾乎同時改變一個變量會發生什么?示例 A:流程一:獲取變量A(為100)過程2:獲取變量A(為100)過程1:加1(就是101)過程2:加1(是101)結果:變量 A 是 101 而不是 102這是一個簡化的示例,具有 Express 路線。假設該路線每秒調用 1000 次:let counter = 0;const getCounter = () => {  return counter;};const setCounter = (newValue) => {  counter = newValue;};app.get('/counter', (req, res) => {  const currentValue = getCounter();  const newValue     = currentValue + 1;  setCounter(newValue);});示例 B:如果我們做一些更復雜的事情,比如Array.findIndex()thenArray.splice()呢?是不是因為另一個事件進程已經改變了數組,所以找到的索引已經過時了?進程 A findIndex(為 12000)進程 B findIndex(它是 34000)工藝A拼接索引12000工藝B拼接索引34000結果:進程 B 刪除了錯誤的索引,應該刪除 33999const veryLargeArray = [  // ...];app.get('/remove', (req, res) => {  const id = req.query.id;  const i  = veryLargeArray.findIndex(val => val.id === id);  veryLargeArray.splice(i, 1);});示例 C:如果我們在示例 B 中添加一個異步操作會怎樣?const veryLargeArray = [  // ...];app.get('/remove', (req, res) => {  const id = req.query.id;  const i  = veryLargeArray.findIndex(val => val.id === id);  someAsyncFunction().then(() => {    veryLargeArray.splice(i, 1);  });});這個問題很難找到合適的詞來描述它。請隨時更新標題。
查看完整描述

1 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

根據@ThisIsNoZaku 的鏈接,Javascript 有一個“運行到完成”原則:

在處理任何其他消息之前,每條消息都會被完全處理。

這在推理您的程序時提供了一些很好的屬性,包括這樣一個事實:每當一個函數運行時,它不能被搶占并且將在任何其他代碼運行之前完全運行(并且可以修改函數操作的數據)。這與 C 不同,例如,如果一個函數在一個線程中運行,它可能會在任何時候被運行時系統停止以在另一個線程中運行一些其他代碼。

此模型的一個缺點是,如果一條消息需要很長時間才能完成,Web 應用程序將無法處理用戶交互,例如單擊或滾動。瀏覽器通過“腳本運行時間過長”對話框來緩解這種情況。一個好的做法是縮短消息處理時間,如果可能的話,將一條消息縮減為多條消息。

進一步閱讀:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop

因此對于:

示例 A:這作為站點計數器非常有效。

示例 B:這也可以正常工作,但是如果同時發生許多請求,那么最后提交的請求將等待相當長的時間。

\remove示例 C:如果在完成之前發送另一個調用someAsyncFunction,那么您的數組完全有可能無效。解決這個問題的方法是將索引結果移動到.thenasync 函數的子句中。

IMO,以延遲為代價,解決了許多潛在的痛苦并發問題。如果您必須優化請求的速度,那么我的建議是研究不同的架構(附加緩存等)。


查看完整回答
反對 回復 2022-06-09
  • 1 回答
  • 0 關注
  • 116 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號