多線程并發(fā)概述

2024-02-16 13:43 更新

簡介

并發(fā)模型是用來實現(xiàn)不同應用場景中并發(fā)任務的編程模型,常見的并發(fā)模型分為基于內(nèi)存共享的并發(fā)模型和基于消息通信的并發(fā)模型。

Actor并發(fā)模型作為基于消息通信并發(fā)模型的典型代表,不需要開發(fā)者去面對鎖帶來的一系列復雜偶發(fā)的問題,同時并發(fā)度也相對較高,因此得到了廣泛的支持和使用,也是當前ArkTS語言選擇的并發(fā)模型。

由于Actor模型的內(nèi)存隔離特性,所以需要進行跨線程的數(shù)據(jù)序列化傳輸。

數(shù)據(jù)傳輸對象

目前支持傳輸?shù)臄?shù)據(jù)對象可以分為普通對象、可轉(zhuǎn)移對象可共享對象、Native綁定對象四種。

普通對象

普通對象傳輸采用標準的結(jié)構(gòu)化克隆算法(Structured Clone)進行序列化,此算法可以通過遞歸的方式拷貝傳輸對象,相較于其他序列化的算法,支持的對象類型更加豐富。

序列化支持的類型包括:除Symbol之外的基礎(chǔ)類型、Date、String、RegExp、Array、Map、Set、Object(僅限簡單對象,比如通過“{}”或者“new Object”創(chuàng)建,普通對象僅支持傳遞屬性,不支持傳遞其原型及方法)、ArrayBuffer、TypedArray。

可轉(zhuǎn)移對象

可轉(zhuǎn)移對象(Transferable object)傳輸采用地址轉(zhuǎn)移進行序列化,不需要內(nèi)容拷貝,會將ArrayBuffer的所有權(quán)轉(zhuǎn)移給接收該ArrayBuffer的線程,轉(zhuǎn)移后該ArrayBuffer在發(fā)送它的線程中變?yōu)椴豢捎?,不允許再訪問。

  1. // 定義可轉(zhuǎn)移對象
  2. let buffer = new ArrayBuffer(100);

可共享對象

共享對象SharedArrayBuffer,擁有固定長度,可以存儲任何類型的數(shù)據(jù),包括數(shù)字、字符串等。

共享對象傳輸指SharedArrayBuffer支持在多線程之間傳遞,傳遞之后的SharedArrayBuffer對象和原始的SharedArrayBuffer對象可以指向同一塊內(nèi)存,進而達到內(nèi)存共享的目的。

SharedArrayBuffer對象存儲的數(shù)據(jù)在同時被修改時,需要通過原子操作保證其同步性,即下個操作開始之前務必需要等到上個操作已經(jīng)結(jié)束。

  1. // 定義可共享對象,可以使用Atomics進行操作
  2. let sharedBuffer = new SharedArrayBuffer(1024);

Native綁定對象

Native綁定對象(Native Binding Object)是系統(tǒng)所提供的對象,該對象與底層系統(tǒng)功能進行綁定,提供直接訪問底層系統(tǒng)功能的能力。

當前支持序列化傳輸?shù)腘ative綁定對象主要包含:ContextRemoteObject。

Context對象包含應用程序組件的上下文信息,它提供了一種訪問系統(tǒng)服務和資源的方式,使得應用程序組件可以與系統(tǒng)進行交互。獲取Context信息的方法可以參考獲取上下文信息。

RemoteObject對象的主要作用是實現(xiàn)遠程通信的功能,它允許在不同的進程間傳遞對象的引用,使得不同進程之間可以共享對象的狀態(tài)和方法,服務提供者必須繼承此類,RemoteObject對象的創(chuàng)建可以參考RemoteObject的實現(xiàn)。

TaskPool和Worker

ArkTS提供了TaskPool和Worker兩種并發(fā)能力供開發(fā)者選擇,其具體的實現(xiàn)特點和各自的適用場景存在差異,詳細請參見TaskPool和Worker的對比

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號