物件Event
Event 模組提供了一個事件對象,用於協同共享資料操作。它允許多個纖程(協程)之間進行同步操作,以實現協作式多任務。事件物件有wait,pulse 和clear 三個方法,wait 方法將阻塞目前纖程,直到事件被觸發,pulse 方法將喚醒所有等待事件的纖程,而clear 方法則將事件標誌重設為false。透過使用coroutine.Event模組,開發者可以控制纖程之間的執行順序和資料共享,實現複雜業務邏輯。
舉個例子,假設我們需要兩個纖程間進行資料共享,然而它們執行的順序是不確定的,你可以透過一個事件對象,控制纖程的執行順序,保證一個纖程執行之前,觸發另一個纖程的事件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19const coroutine = require('coroutine');
var evt = new coroutine.Event();
coroutine.start(function() {
console.log('[1] wait for event');
evt.wait();
console.log('[1] receive event');
});
coroutine.start(function() {
loop: for (var i = 0; i < 10; i++) {
console.log('[2] do some work');
if (i === 5) {
evt.pulse();
}
coroutine.sleep(1000);
}
});
在上面的例子中,我們建立了一個事件物件evt,在纖程1中使用wait方法等待事件觸發,而在纖程2中透過pulse方法觸發事件,當i等於5的時候,纖程2觸發事件,纖程1透過事件監聽被喚醒,繼續執行。在這個過程中,兩個纖程之間沒有使用任何的鎖或其它同步工具,但是它們在纖程層級上保證了資料的同步。
繼承關係
建構函數
Event
事件物件建構函數
1new Event(Boolean value = false);
呼叫參數:
- value: Boolean, 指定是否等待,為true 時等待,預設為false
成員函數
isSet
判斷事件物件是否為真
1Boolean Event.isSet();
回傳結果:
- Boolean, 如果事件為真,則回傳true
set
啟動事件(將事件狀態改為true),並呼叫pulse()
1Event.set();
pulse
啟動等待該事件的所有纖程
1Event.pulse();
clear
重置事件(將事件狀態改為false)
1Event.clear();
wait
等待一個事件
1Event.wait();
acquire
取得鎖的擁有權
1Boolean Event.acquire(Boolean blocking = true);
呼叫參數:
- blocking: Boolean, 指定是否等待,為true 時等待,預設為真
回傳結果:
- Boolean, 回傳是否成功取得鎖,為true 表示成功獲取
acquire 方法用於取得鎖的所有權,當鎖處於可取得狀態時,此方法立即傳回true。
當鎖不可獲取,且blocking 為true,則目前纖程進入休眠,當其他纖程釋放鎖後,此方法傳回true。
當鎖不可取得,且blocking 為false,則方法傳回false。
release
釋放鎖的擁有權
1Event.release();
此方法將釋放對鎖的擁有權,如果目前纖程未擁有鎖,此方法將拋出錯誤。
count
查詢目前等待任務數
1Integer Event.count();
回傳結果:
- Integer, 返回任務數
toString
傳回物件的字串表示,一般回傳"[Native Object]",物件可以根據自己的特性重新實現
1String Event.toString();
回傳結果:
- String, 傳回物件的字串表示
toJSON
傳回物件的JSON 格式表示,一般傳回物件定義的可讀屬性集合
1Value Event.toJSON(String key = "");
呼叫參數:
- key: String, 未使用
回傳結果:
- Value, 傳回包含可JSON 序列化的值