Skip to content

andrew0928/ParallelProcessPractice

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Sep 22, 2019
46fe12e · Sep 22, 2019

History

56 Commits
Sep 21, 2019
Sep 10, 2019
Sep 22, 2019
Sep 14, 2019
Aug 29, 2019
Sep 3, 2019
Sep 7, 2019
Sep 14, 2019
Sep 3, 2019
Sep 21, 2019
Aug 25, 2019
Sep 10, 2019
Sep 15, 2019
Sep 22, 2019
Sep 1, 2019
Aug 30, 2019
Aug 24, 2019
Aug 29, 2019
Sep 21, 2019
Aug 24, 2019

Repository files navigation

Parallel Process Practices

目標: 請用最少的時間, 完成 1000 個 MyTask instances 的三個步驟。 限制: 每個 MyTask 的同一個步驟,都無法併行處理。

作法

  1. 請建立你自己的 Console App, 參考 ParallelProcessPractice.Core 專案
  2. 建立你自己的衍生類別:
public class AndrewTaskRunner : TaskRunnerBase
{
    public override void Run(IEnumerable<MyTask> tasks)
    {
        foreach (var t in tasks)
        {
            t.DoStep1();
            t.DoStep2();
            t.DoStep3();
            Console.WriteLine($"exec job: {t.ID} completed.");
        }
    }
}
  1. 執行你的 test:
static void Main(string[] args)
{
    TaskRunnerBase run = new AndrewTaskRunner();
    run.ExecuteTasks(10);
}
  1. 執行結果:

Execution Summary: PASS

* Max WIP:
  - ALL:      1
  - Step #1:  1
  - Step #2:  1
  - Step #3:  1

* Execute Time:
  - Time To First Task Completed: 614.3636 msec
  - Time To Last Task Completed:  6047.8443 msec

* Execute Count:
  - Total:   10
  - Success: 10
  - Failure: 0

評比標準:

只有第一行顯示 PASS 才算通過。顯示 FAIL 則所有數據均不承認。詳細資訊可以從 Execute Count 得知詳細的成功與失敗數量。

執行效率會參考兩個指標,第一優先的指標是 WIP, 第二優先的指標是 Execute Time

  • 半成品 WIP (Work In Progress):

代表同時間在處理中的 Task 總數。處理中的 Task 會需要耗用資源 (記憶體,資料庫連線,CPU 等等),因此好的 code 應能妥善控制 WIP 的數量,數字越少越好。

  • 執行時間 (Execute Time):

代表執行花費的總時間,越少越好。

指標參考的優先順序 (由高到低):

  1. WIP (ALL)
  2. Execute Time (FIRST TASK)
  3. Execute Time (TOTAL TASK)
  4. WIP (STEP1)
  5. WIP (STEP2)
  6. WIP (STEP3)

Task 特徵設定

這個練習專案的 Task 有幾個前提, 例如總共有 3 個步驟 (Step), 每個步驟有既定的執行時間 (Duration), 也有並行處理的限制。 這些設定都集中在 PracticeSettings.cs 內。若需要調整組態來模擬不同情境,可以直接調整:

internal static class PracticeSettings
{
    public const int TASK_TOTAL_STEPS = 3;

    public static readonly int[] TASK_STEPS_DURATION =
    {
        0,  // STEP 0, useless
        300,
        100,
        200
    };

    public static readonly int[] TASK_STEPS_CONCURRENT_LIMIT =
    {
        0,  // STEP 0, useless
        1,
        1,
        1
    };
}

其中:

  • TASK_TOTAL_STEPS 代表總共有多少 STEP 需要處理。
  • TASK_STEPS_DURATION 代表每個 STEP 處理需要花費的時間 (msec), 為了簡化設計, 這個陣列設定值 indexer 是從 1 開始。因此第一筆 [0] 會被忽略不計。
  • TASK_STEPS_CONCURRENT_LIMIT 代表每個 STEP 允許最大同時處理的數量。同上, 第一筆 [0] 會被忽略不計。

About

後端工程師必備: 平行任務處理的思考練習 - Demo Code

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages