Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

第十一章:依賴排序與流程編排:把前後關係排成可執行順序

本章目標
情境與限制
可重現規則

有前後依賴的工作,不能只靠直覺排

很多工作不是單純列清單就能做,而是有明確先後順序。你不能先上線再送審,也不能先送審再完成文件。這類問題的核心不是挑哪件先做最快,而是先釐清哪些事情必須等別的事情完成。

把這種關係畫成圖之後,每個任務是一個節點,依賴關係則是一條邊。只要圖中沒有循環,就可以用拓樸排序找出一條合法順序;如果有循環,就表示流程本身有矛盾,需要先拆解。

為什麼不能只憑直覺排

當任務量很少時,人可以靠經驗記住順序;但一旦牽涉多個部門、多份文件或多個系統,直覺很容易漏掉隱藏依賴。實務上常見的兩種錯誤是:

  1. 以為某件事可以先做,實際上卡在前置項目還沒完成。

  2. 兩件事互相等待,最後整條流程完全停住。

把依賴顯性化之後,排序與除錯都會清楚很多。

一條順序與分階段執行是不一樣的

有時你只需要一條合法順序;但有時管理者更想知道的是「哪些事情可以同時開始」。這時比起單一路徑,分階段執行更有用,因為它能把同一輪可同步進行的工作放在一起。

所以本章除了回傳單一排序,也會提供依批次分組的結果,方便用在週會、看板或執行排程上。

實作範例

請參考 examples/ch11/workflow.py。請在專案根目錄執行程式,以確保路徑正確。

from examples.ch11.workflow import plan_execution_order, group_execution_stages

tasks = {
    "A": [],          # 無依賴
    "B": [],          # 無依賴
    "C": ["A", "B"],  # 依賴 A, B
    "D": ["B"],       # 依賴 B
    "E": ["C", "D"],  # 依賴 C, D
}

order = plan_execution_order(tasks)
print("執行順序:", order)
# 執行順序: ['A', 'B', 'C', 'D', 'E']

stages = group_execution_stages(tasks)
print("分階段執行清單:")
for i, stage in enumerate(stages):
    print(f"階段 {i+1}: {stage}")
# 分階段執行清單:
# 階段 1: ['A', 'B']
# 階段 2: ['C', 'D']
# 階段 3: ['E']

示範流程包含: