
664
|
第十六章
首先,注意
MapIndexed
指令用來作為工作起點,此指令相當適合做此用途,其所產生的
索引值可作為工作識別值。
slaveHandler
函數內的變數
jobId
除了回傳給主要核心外沒
有特別作用,此變數告訴主要核心所完成的工作為何。相同地,你也許會想既然只要執
行第一個工作項目,為什麼還需傳遞整個待辦清單至次要核心,其實目的很簡單,這使
得
pipelineProcessor
函數不必特別管理執行狀態;當函數從次要核心接收回應時,馬
上可以知道剩餘的工作,這也稱為
狀態無關方式
(
stateless
),因為主要核心與次要核
心都不需維護目前執行狀態,而只需直接處理目前的待辦清單即可。
第二點,請注 意
With
指令的作 用是將
ParallelSubmit
引數內的 表示式進行運 算, 這
一步 很重要, 因為
ParallelSubmit
指令 會將表 示式以 暫緩 執行的 格式 傳遞至 次要 核
心,在次要核心進行運算;而這很可能會失敗,因為所包含的符號(如本例的
todo
與
result
)並不存在於次要核心上。[Page-668]
而你或許會問一個問題,究竟為什麼要使用管線方式執行平行運算?以前例來說,既
然知道要 對影像進 行 一連串的 操作,為何不 一 次將所有 操作包裝為 一個函數,並 以
ParallelMap
指令將圖形分散至不同核心進行處理呢?在某些情況下,管線方式確實是
比較好用的,以下有幾個原因:
中間計算結果
(Intermediate results)
對某些問題而言,你想保存每個步驟