當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python graphlib.TopologicalSorter用法及代碼示例


用法:

class graphlib.TopologicalSorter(graph=None)

提供對可散列節點圖進行拓撲排序的函數。

拓撲順序是圖中頂點的線性排序,使得對於從頂點 u 到頂點 v 的每個有向邊 u -> v,頂點 u 在排序中位於頂點 v 之前。例如,圖的頂點可能代表要執行的任務,而邊可能代表一個任務必須在另一個任務之前執行的約束;在此示例中,拓撲排序隻是任務的有效序列。當且僅當圖沒有有向環,即如果它是有向無環圖時,完整的拓撲排序是可能的。

如果提供了可選的 graph 參數,則它必須是表示有向無環圖的字典,其中鍵是節點,值是圖中該節點的所有前導的可迭代(具有指向中值的邊的節點)鑰匙)。可以使用 add() 方法將其他節點添加到圖形中。

在一般情況下,對給定圖執行排序所需的步驟如下:

如果隻需要立即對圖中的節點進行排序並且不涉及並行性,則可以直接使用便捷方法TopologicalSorter.static_order()

>>> graph = {"D": {"B", "C"}, "C": {"A"}, "B": {"A"}}
>>> ts = TopologicalSorter(graph)
>>> tuple(ts.static_order())
('A', 'C', 'B', 'D')

該類旨在輕鬆支持節點準備就緒時的並行處理。例如:

topological_sorter = TopologicalSorter()

# Add nodes to 'topological_sorter'...

topological_sorter.prepare()
while topological_sorter.is_active():
    for node in topological_sorter.get_ready():
        # Worker threads or processes take nodes to work on off the
        # 'task_queue' queue.
        task_queue.put(node)

    # When the work for a node is done, workers put the node in
    # 'finalized_tasks_queue' so we can get more nodes to work on.
    # The definition of 'is_active()' guarantees that, at this point, at
    # least one node has been placed on 'task_queue' that hasn't yet
    # been passed to 'done()', so this blocking 'get()' must (eventually)
    # succeed.  After calling 'done()', we loop back to call 'get_ready()'
    # again, so put newly freed nodes on 'task_queue' as soon as
    # logically possible.
    node = finalized_tasks_queue.get()
    topological_sorter.done(node)

3.9 版中的新函數。

相關用法


注:本文由純淨天空篩選整理自python.org大神的英文原創作品 graphlib.TopologicalSorter。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。