跳至內容
Astera Technology

前一輪未完,下個排程怎樣處理?

同一觸發紀錄,排隊、跳過及重疊各有不同結果。

下載完整個案資料及參考答案 ↓

訂判斷及所需輸入

第零及十分鐘觸發,每輪十二分鐘。題內排隊規則第二輪十二才開始、二十四完;重疊路徑十就開始、二十二完。跳過規則只跑第一輪,第十要明記已跳。

已填本地測試工作表
情況輸入 JSON
原例測試{"policy":"queue","triggers":[0,10],"duration":12}
下載可編輯 CSV ↓

跑所附比較

固定本地排程器真正建立各輪原定、開始及完成時間,只訂本例應怎樣執行,不代表平台功能或正式效能。

錯誤及所需輸出
路徑輸出 JSON
錯誤路徑{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":10,"finish":22}],"skipped":[]}
所需路徑{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":12,"finish":24}],"skipped":[]}
下載可編輯 CSV ↓
完整本地 Node24.14.1 程序
import assert from 'node:assert/strict';

const run=function run(i,corrected=true){
    if(!['queue','skip','overlap'].includes(i.policy))return {held:true};
    const runs=[],skipped=[];let busyUntil=-Infinity;
    for(const scheduled of i.triggers){const policy=corrected?i.policy:'overlap';if(policy==='skip'&&scheduled<busyUntil){skipped.push(scheduled);continue;}
      const start=policy==='queue'?Math.max(scheduled,busyUntil):scheduled;const finish=start+i.duration;runs.push({scheduled,start,finish});busyUntil=Math.max(busyUntil,finish);}
    return {runs,skipped};
  };
const cases=[{"input":{"policy":"queue","triggers":[0,10],"duration":12},"corrected":false,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":10,"finish":22}],"skipped":[]}},{"input":{"policy":"queue","triggers":[0,10],"duration":12},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12},{"scheduled":10,"start":12,"finish":24}],"skipped":[]}},{"input":{"policy":"skip","triggers":[0,10],"duration":12},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":12}],"skipped":[10]}},{"input":{"policy":"queue","triggers":[0,10],"duration":10},"corrected":true,"expected":{"runs":[{"scheduled":0,"start":0,"finish":10},{"scheduled":10,"start":10,"finish":20}],"skipped":[]}},{"input":{"policy":null,"triggers":[0,10],"duration":12},"corrected":true,"expected":{"held":true}}];
for(const test of cases){const actual=await run(test.input,test.corrected);assert.deepEqual(actual,test.expected);console.log(actual);}
下載可執行例子 ↓

按邊界依據作判斷

若每輪剛好十分鐘,下輪十可開始而不重疊;規則欠缺便先停,不計所謂應有輸出。

  1. 核重疊時如何處理
  2. 跑題內觸發紀錄
  3. 核各輪及已跳觸發

只說有排程,未代表會排隊。

可編輯邊界輸入及結果
條件輸入 JSON預期輸出 JSON
正忙時明訂跳過{"policy":"skip","triggers":[0,10],"duration":12}{"runs":[{"scheduled":0,"start":0,"finish":12}],"skipped":[10]}
剛完便可開始下一輪{"policy":"queue","triggers":[0,10],"duration":10}{"runs":[{"scheduled":0,"start":0,"finish":10},{"scheduled":10,"start":10,"finish":20}],"skipped":[]}
重疊處理未訂{"policy":null,"triggers":[0,10],"duration":12}{"held":true}
下載可編輯 CSV ↓

原例排隊後,第二輪在哪段時間?

查看參考答案

十二至二十四,對原定十的觸發。十至二十二是重疊規則的結果。

相關資源