MessageChannel 訊息通道

2022-03-03 03:41:58 字數 2626 閱讀 4575

一、初識 messagechannel 物件

通過建構函式messagechannel()可以建立乙個訊息通道,例項化的物件會繼承兩個屬性:port1port2

port1 和 port2 都是 messageport 物件,在這裡是唯讀的,無法對其進行字面量賦值

不過可以給port新增屬性

上圖還體現了messageport物件具有onmessageonmessageerror兩個屬性

這是兩個**方法,使用messageport.postmessage方法傳送訊息的時候,就會觸發另乙個埠的onmessage

訊息通道就像是一條左右貫通的管道,左右兩個埠就是 port1 和 port2

這兩個埠可以相互傳送訊息,port1 傳送的訊息可以在 port2 接收到,反之亦然

二、多個 web worker 之間通訊

messagechannel 可以結合 web worker 實現多執行緒通訊

//

main.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)

這裡的 postmessage() 可以接收兩個引數:message、transferlistmessage

訊息內容,可以是任意基礎資料型別

transferlist

由被傳輸物件組成的陣列,這些物件的所有權會轉移給呼叫 postmessage 的物件

所以上面的**,就是把訊息通道的 port1 分配給了 worker1,把 port2 分配給 worker2

也就是用訊息通道,將兩個 worker 給連線起來

//

worker1.js

onmessage = function

(e)

}

//

worker2.js

onmessage = function

(e) }}

**執行的時候,worker1 中通過 port1 傳送訊息,然後 worker2 就能從 port2 中接收到訊息

三、深拷貝

大部分需要深拷貝的場景,都可以使用以下**:

json.parse(json.stringify(object))
但這種辦法會忽略undefined、function、symbol迴圈引用的物件而通過postmessage()方法傳輸的message引數是深拷貝的

所以可以借用 messagechannel 實現深拷貝:

//

深拷貝函式

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()

但這個深拷貝只能解決 undefined 和迴圈引用物件的問題,對於 symbol 和 function 依然束手無策

矩陣消元 高斯消元

安利一波高斯消元的部落格,內容很詳細。看完這個相信你已經理解了大概,高斯消元求線性方程組,在學習線性代數 大學課程 的時候我們都接觸過。原理是先把執行緒組轉換成矩陣,然後把它等價變換成上三角矩陣,這樣從下到上依次可以求出解集。高斯消元模板 模板題 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行,...