一、初識 messagechannel 物件
通過建構函式messagechannel()可以建立乙個訊息通道,例項化的物件會繼承兩個屬性:port1和port2
port1 和 port2 都是 messageport 物件,在這裡是唯讀的,無法對其進行字面量賦值
不過可以給port新增屬性
上圖還體現了messageport物件具有onmessage和onmessageerror兩個屬性
這是兩個**方法,使用messageport.postmessage方法傳送訊息的時候,就會觸發另乙個埠的onmessage
訊息通道就像是一條左右貫通的管道,左右兩個埠就是 port1 和 port2
這兩個埠可以相互傳送訊息,port1 傳送的訊息可以在 port2 接收到,反之亦然
二、多個 web worker 之間通訊
messagechannel 可以結合 web worker 實現多執行緒通訊
//這裡的 postmessage() 可以接收兩個引數:message、transferlistmessagemain.js
let worker1 = new worker('./worker1.js');
let worker2 = new worker('./worker2.js');
let ms = new
messagechannel();
// 把 port1 分配給 worker1
worker1.postmessage('main', [ms.port1]);
// 把 port2 分配給 worker2
worker2.postmessage('main', [ms.port2]);
worker2.onmessage = function
(event)
訊息內容,可以是任意基礎資料型別
transferlist
由被傳輸物件組成的陣列,這些物件的所有權會轉移給呼叫 postmessage 的物件
所以上面的**,就是把訊息通道的 port1 分配給了 worker1,把 port2 分配給 worker2
也就是用訊息通道,將兩個 worker 給連線起來
//worker1.js
onmessage = function
(e)
}
//**執行的時候,worker1 中通過 port1 傳送訊息,然後 worker2 就能從 port2 中接收到訊息worker2.js
onmessage = function
(e) }}
三、深拷貝
大部分需要深拷貝的場景,都可以使用以下**:
json.parse(json.stringify(object))但這種辦法會忽略undefined、function、symbol和迴圈引用的物件而通過postmessage()方法傳輸的message引數是深拷貝的
所以可以借用 messagechannel 實現深拷貝:
//但這個深拷貝只能解決 undefined 和迴圈引用物件的問題,對於 symbol 和 function 依然束手無策深拷貝函式
function
deepclone(val) = new
messagechannel()
port2.onmessage = e =>resolve(e.data)
port1.postmessage(val)
})}//
定義乙個包含 undefined 的物件
let obj =}//
迴圈引用
obj.c.e =obj.c
//注意該方法是非同步的
async function
test()
test()
矩陣消元 高斯消元
安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 include define n 205 using...
水平消隱和垂直消隱 複核消隱訊號
電子槍從左到右畫出象素,它每次只能畫一條掃瞄線,畫下一條之前要先回到左邊並做好畫下一條掃瞄線的準備,這之間有一段時間叫做水平消隱 hblank 在畫完全部掃瞄線 行 之後它又回到螢幕左上角準備下一次畫螢幕 幀 這之間的一段時間就是垂直消隱 vblank 電子槍就是在不斷的走 之 字形。復合消隱訊號 ...
高斯消元 浮點高斯消元
浮點數高斯消元 問題描述 給出乙個線性方程組,有n個方程組,m個未知數。解這個線性方程組。輸入格式 第1行 2個整數n和m,n,m 400,且n不一定等於m 接下來n行,每行m 1個整數,表示乙個方程的m個未知數的係數和常數 輸出格式 如果無解,輸出 no solution 如果有唯一解,輸出m行,...