Skip to main content

PySchedulerで処理を確認する

のおかげで、PDGの各種ノードを簡単に検証できるようになって来たので、 個人的にPDGをやっていて一番全容がわからないスケジューラーを、PySchedulerノードを使用して検証していこうと思います。

テストシーンを作る

まず、TopNet で、GenericGenerator と PythonScript を作成します。
GenericGenerator は ItemCount を 5 として、PythonScript は

print("exec PythonScript!!")
import time

for i in range(3):
print(i)
time.sleep(1)

Out-Of-Process にしたうえで、
PythonBin をカスタム、実行するバージョンを 3.9 になるようにしておきます。
処理は、実行されたのがわかるように+一瞬だと何が起きたか把握しにくいので 3 秒ほどプリントするようにしておきます。

そして、スケジューラーを作り、pythonscript1 ノードの

Schedulers の TOP Scheduler Override を、作成したスケジューラーにして HIP を保存します。
保存できたら、 hbatch から実行してみます。

比較として、デフォルトのローカルスケジューラーは

若干わかりにくいのですが、複数の WorkItem を確認すると、開始時刻がほぼ同じだというのがわかると思いますが
ローカルスケジューラーがいい感じに並列で処理してくれているのがわかります。

対して、PythonScheduler がどうなっているかというと

実行結果はこちら。
今はスケジューラー側は何もしていないので、このように pythonscript1 の処理が直列で実行されています。
つまりは、スケジューラーにまかせたい「各ワークアイテムを割り振って実行してもらう」という部分が
基本「実行する以外なにもない」状態が、この PythonScheduler のデフォルトだというのがわかるかと思います。

ということで、この何もない状態から、動作や役割を順番に確認しながら
機能を実装していきます。

Save to Python Script

まず、PythonScheduler 全体をみてみます。
PDG の各ノードはすべて Python で実装可能なのですが、スケジューラーもその例にもれず
実際には PythonFile として扱うことも可能です。
「Save To Python Script」をおすと、この PythonScheduler ノードの各項目を
スケジューラークラスを継承したクラスの関数にして、指定フォルダ以下に保存してくれます。

なので、最終的には作成したスケジューラーは Python ファイルとして共有することになります。

処理の流れを確認してみる

色々タブがありますが、関係性がわからないので、全部のコードに、

このようにタブの名前をプリントするコードを突っ込んでみます。
そして ItemCount を 2 にして、実行してみます。

実行結果。 整理すると、

このようになります。
print したけど実際には実行されていない処理もいくつかあるようですが、

topcook で指定の TopNet をクックすると、その段階で「onStartCook」が実行され、
すべての処理が完了すると onStopCook が呼ばれる。
そのあとに onTick が実行される。 WorkItem の数だけ、onSchedule が呼ばれ、その中で pythonsript1 の処理が実行される。

現状の関係性はこのようになっています。
何となくどこから手を付けていいか見えてきた気がします。

ということで、次回は onSchedule のコードを詳しく見ていきます。