ecto 簡介 (2) – tendrils 與 scheduler
前言
上次的文章介紹了 ecto 的基本機制 – cell 與 plasm,讓大家對於這個函式庫的基本功能有了一個認識,但你可能會感到疑惑,如果只是可以用來建立一個如 DAG 方式來執行的 pipeline ,寫在 main 函式裡不就好了,何苦使用 ecto,還得把一個 class 寫成一個又臭又長的 cell。這篇文章就會帶出 tendril 和 scheduler 的機制,讓大家了解到事情並不像我們想得那麼簡單。
tendril 是什麼 & tendril 好用在哪裡
tendril 這個 object 就是 cell 最基本的溝通媒介,舉凡 cell 的輸入、輸出以及 parameter 的傳遞都會使用到 tendril 。在上一篇我們也可以看到,cell 的函式定義裡面,都是使用 tendril 這個型態來傳遞參數。
1 | struct Example01 |
使用起來只要寫一小段 Python Script 就好:
1 | #!/usr/bin/python |
那統一寫成 tendril 的好處是什麼呢? 統一的好處很直觀,就是很容易被廣泛地使用,舉例來說,如果我們今天要寫一個 scheduler 來控制整個 plasm 的排程,那每個 cell 的參數、輸入和輸出都統一用 tendril 在實作上會比較簡單。舉個例子,cell 的 process(const tendrils&, const tendrils&)就一定是固定有兩個 const 的 tendrils 類型的引數,不會被使用者任意自訂。
這邊還有另一個容易讓人搞混的地方,就是 tendril 跟 tendrils 的差異,這兩個東西是不一樣的,tendrils 可以想成是一個裝著 tendril 的容器,可以給 tendril 的名字,這個名字會被當作一個 key (型態自然就是 string),用來對應到 tendril 的物件。
Scheduler 是什麼
Scheduler 是幫忙控制 plasm 執行的工具,比較酷的是 ecto.MultiPlasmScheduler 這個類別,他可以讓我們輕鬆地平行執行多個 plasm ,例如我們有三個 plasm 要執行,且三個想要執行的頻率不一樣,那使用 MultiPlasmScheduler 可以透過設定 step 的大小來控制頻率。
自己如果想實作,那就要跟 multi-threads 奮戰,中間細致的控制滿容易出錯的,如果 thread 一多,debug更是困難。
ecto 可以讓我們從比較上層的角度來控制多個 plasm ,有看到一個 test script 是使用 MultiPlasmScheduler 來執行兩個 thread,跟上面的範例圖不一樣,不過概念是相近的:
1 | #!/usr/bin/env python |
但是這一塊的 API 跟教學文章很不完整,要深入了解可能要看撰寫 ecto 的這些高手們怎麼把 ecto 用在 OpenCV、PCL 等開源的電腦視覺函式庫中,之後的文章會更深入探討。
總結
這一篇文章簡單跟大家介紹了 tendril 跟 scheduler 的概念,對於 ecto 的功能及彈性更加有感覺,不過看完這一篇可能還不太知道要怎麼活用 ecto,下一篇會帶大家實際來玩玩這個工具,會更通 ecto 可以做到的事跟實際應用的範例。
留言討論