Houdini 18.0 タスクを実行する方法

プロセッサ系ノードコールバック

プロセッサ系ノードはスケジューラで実行可能なワークアイテムを生成します。

On this page

概要

プロセッサは、PDGグラフで主なタイプのノードの1つです。 各プロセッサ系ノードは、上流の入力ワークアイテム、そのノード自体のパラメータ、外部リソースを使って新しいワークアイテムを生成することができます。 このノードは、ワークアイテムにアトリビュート値を設定し、そのワークアイテム用のコマンドラインを設定し、そのワークアイテムを子プロセスで評価するのか現行Houdiniセッションで評価するのか定義することができます。 MergeTOPとAttribute CreateTOPは、アトリビュート値を持ったワークアイテムを作成する単純なプロセッサであるのに対して、 ROP Fetchは実行するのにスケジュールを組む必要があるワークアイテムを作成するもっと複雑なプロセッサです。

どのプロセッサ系ノードも静的または動的のどちらにも対応しており、これによってプロセッサがワークアイテムを生成するタイミングが決まります。 静的プロセッサは、PDGグラフクックの前に実行される静的プリパス中にワークアイテムを生成します。 動的プロセッサは、入力ノード内のワークアイテムがクックする度に1つ以上のワークアイテムを生成します。 この挙動は、どのプロセッサ系ノードにもある Work Item Generation パラメータを使って設定することができます。 プロセッサ系ノードのインスタンスは、そのパラメータに基づいて、どちらかのタイプのワークアイテムのみを生成します。 プロセッサは、同時に静的ワークアイテムと動的ワークアイテムを混在させることができません。

ノードコールバック

各プロセッサ系ノードには、その挙動を制御するために実装可能なコールバックがいくつか備わっています。 プロセッサ系ノードでコールバックを記述する時に実装で必須となる唯一のコールバックがonGenerateです。このフックが実際にワークアイテムを生成する役割を担っています。 ワークアイテムが In Process としてマークされた際にそのワークアイテムをクックするのに使用されるロジックを用意したいのであれば、onCookTaskコールバックを実装する必要があります。 ワークアイテムを構築する時にinProcessキーワード引数をTrueに設定すると、そのワークアイテムがIn Processとしてマークされます。 他のすべてのノードコールバックは任意であり、そのノードの挙動をさらにカスタマイズしたい場合にのみ使用します。

コールバックは、それが成功したのか失敗したのかを示したpdg.resultを返すことができます。 pdg.result.Allなどの他の特別な結果タイプは、プロセッサ系ノードでは使用しません。 1つ以上のプロセッサ系ノードが静的ワークアイテム生成パス中に失敗を返したら、そのクックは停止されます。 動的プロセッサの場合、失敗してもクックは停止されず、別の上流ワークアイテムの他のonGenerateコールによって生成されたワークアイテムが実行を継続します。

Warning

PDGは、コールバックの入力として渡されたワークアイテムのアトリビュートが、そのコールバック中に安全に読み込めるようにします。 また、コールバック中に生成されたすべてのワークアイテムを安全に読み書きします。 ただし、ノード上のメンバー変数にワークアイテムを格納することも、上流のワークアイテムにアトリビュートを書き出すこともできません。

どれかのTaskコールバックが実行されている間、Pythonコードは、その関数に直接渡されたワークアイテムのアトリビュートにのみアクセスすることができます。 このコールバックコードは、そのワークアイテムのアトリビュートを読み書きしたり、出力ファイルを追加することができます。 このコールバックコードは、そのワークアイテムの親または依存関係から自由にアトリビュートを読み込むこともできますが、そのノード内の他のワークアイテムにはアクセスしないでください。

onGenerate(item_holder, upstream_items, generation_type)pdg.result

このコールバックは、プロセッサ系ノードが新しいワークアイテムを生成する度に評価されます。 pdg.WorkItemHolder引数は、そのノード内で新しいワークアイテムを生成する際に使用されるファクトリーオブジェクトです。 コールバックが成功を返さない限り、そのワークアイテムはそのプロセッサ系ノードまたはPDGグラフに追加されません。 このコールバックが失敗すると、コールバックの途中まで評価されて生成されたすべてのものが削除されます。

addWorkItemメソッドを使用すると、ワークアイテムをホルダーに追加することができます。このメソッドには、キーワード引数のリストまたはpdg.WorkItemOptionsヘルパーオブジェクトを渡すことができます。 これらの引数は、ネットワークアイテムの名前、インデックス、タイプを設定する際に使用されます。 pdg.WorkItemOptions APIドキュメントに載っている各エントリーも同じ名前を使ってキーワード引数として渡すことができます:

# オプションの使い方:
options = pdg.WorkItemOptions()
options.name = "example"
options.inProcess = True
item_holder.addWorkItem(options)

# kwargsの使い方:
item_holder.addWorkItem(name="example", inProcess=True)

addWorkItemメソッドは、新しいワークアイテムを返すので、コールバックコードでアトリビュート値またはワークアイテムのコマンドラインを設定することができます:

new_item = item_holder.addWorkItem()
new_item.setStringAttrib('example_attrib', 'example value')
new_item.setCommand('echo "hello"')

ノードに何も入力がなかった場合、コールバックに渡される上流ワークアイテムのリストには、何のワークアイテムも入りません。 ノードに入力ノードがあった場合、そのノードが動的であればそのリストには1個のワークアイテムが、静的であればそのリストには上流ワークアイテムの全リストが入ります。 最後に、generation_type引数は、ワークアイテムを生成する際に、そのコールバックを静的ノードまたは動的ノードのどちらに対してコールするのかを決めます。 pdg.generationTypeは、そのコールバック関数に渡された列挙の詳細をリストします。

onRegenerateStatic(item_holder, existing_items, upstream_items)pdg.result

このコールバックは、ノードが既存のワークアイテムを持っていて、且つ、最後のクックからパラメータに変更があった時に静的クックプロセス中にコールされます。 このコールバックによって、ノードがワークアイテムをDirty(変更あり)、削除、修正したり、新しいワークアイテムを追加する機会が得られます。 デフォルトでは、どのノードもonGenerateフックのコールによってワークアイテムを再生成してマージする標準ビルトインの実装を持っています。 たいていの場合、あなたのノードが外部リソースを使ってワークアイテムを生成している場合にのみこのコールバックを実装する必要があります。 例えば、File Patternノードは、特定のパターンに合致したファイル毎にワークアイテムを作成するので、このコールバックでは、ディスク上のファイルのタイムスタンプと存在の有無をチェックする独自の再生成ロジックを定義します。

このコールバック関数の引数はonGenerateと同様ですが、追加のexisting_itemsリストには、このノード内に既に存在している静的ワークアイテムのリストを格納します。

Note

動的ノードに設定されたプロセッサ系ノード内にワークアイテムを再生成するのは、現在のところできません。

onAddInternalDependencies(dependency_holder, work_items, is_static)pdg.result

このメソッドは、onGenerateコールバック時に生成されたワークアイテム間に兄弟/内部依存関係を追加する時にコールします。 これらは、同じノード内のワークアイテム間に存在する依存関係です。 このコールバックの入力は、最後のonGenerateコールバックで生成されたワークアイテムのリストです。

Note

内部依存関係は、同じonGenerateコールで生成されたワークアイテム間にのみ追加することができます。 is_staticブールは、その入力ワークアイテムが静的または動的のどちらで生成されたのかを示します。

PDGは、これらの依存関係すべてがクックされた時にのみワークアイテムをクックするので、あなたのノードが特定の順番で完了させる必要のあるワークアイテムを生成する場合には、内部依存関係の追加が役に立ちます。 例えば、フィードバックループブロックの開始ノードは、ループ内の反復間で内部依存関係を追加します。

onPreCook()pdg.result

このコールバックは、クック中に評価されるすべてのノードに対して、そのクックの開始時点で1度コールされます。 このコールバックは、onGenerateコールバックの前にコールされ、そのノードが共有リソースを読み込んだり、変数を初期化する機会が得られます。

onPostCook()pdg.result

このコールバックは、最後のワークアイテムがクックを完了した後に、クック中にアクティブだったすべてのノードに対して1度コールされます。 このコールバックによって、ノードがクック中に使用した共有リソースをアンロードする機会が得られます。

onPrepareTask(work_item)pdg.result

このコールバックは、そのノード内の各ワークアイテムがクックのスケジュールに組まれる直前に1度コールされます。 このメソッドは、PDGがディスク上のキャッシュファイルをチェックする前にコールされるので、キャッシュ化の用途で必要な出力ファイルを追加する手段として使用することができます。 他にも、出力ファイルやワークアイテムの依存関係のアトリビュートにアクセスしたり、ワークアイテムのコマンドラインを変更したり、ワークアイテムをクックする直前に必要な処理を行う時にも使用することができます。 このメソッドがpdg.result.Failureを返すと、そのワークアイテムは失敗としてマークされます。

ROP Fetchノードは、分散シミュレーションを走らせる際にこのコールバックを使用することで、sim trackerが起動していることを確認し、シミュレーションワークアイテムをクックする前にトラッカー情報をそのシミュレーションワークアイテムに渡します。 ROP Fetch内のワークアイテムは、静的ワークアイテムとして生成することができ、クックを開始するまではsim trackerのポート/IPが分からないので、 このコールバックを使用して、シミュレーションワークアイテムにそのトラッカーの詳細を追加します。

onPrepareTaskコールバックは、バッチワークアイテム自体だけでなく、そのバッチ内のサブワークアイテム毎にコールされます。 コールバック呼び出しの順序は、バッチワークアイテムのアクティベーションモードによって異なります。 バッチのアクティベーションモードがpdg.batchActivation.Allに設定されていれば、PDGは、バッチの実行をするスケジュールが組まれる直前に、サブワークアイテム毎にonPrepareTaskフックを実行してから、そのバッチワークアイテム自体にonPrepareTaskフックを実行します。 アクティベーションモードが他のオプションのどれかに設定されていれば、このコールバックは、サブワークアイテム毎にそのサブワークアイテムの依存関係がすべて完了した後でコールされます。 このコールバックは、バッチの実行準備が整った時にバッチワークアイテム自体に対して実行されます。 つまり、バッチがpdg.batchActivation.Firstに設定されていると、onPrepareTaskコールの順序に保証がありません。 このコールバックは、サブワークアイテムのコール間でバッチワークアイテムに対してコールすることもできます。

onCookTask(work_item)pdg.result

このコールバックは、In-Processワークアイテムがクックを必要とした時にコールされます。 これは、In-Processワークアイテムとして明示的に生成されたワークアイテムに対してのみ実行されます。 In-Processワークアイテムは、onGenerateコールバック時にinProcess=True`引数を渡してワークアイテムをワークアイテムホルダに追加することで生成されます。 このコールバックは、ワークアイテムをクックする上で必要となるIn-Processロジックを実行するだけでなく、ワークアイテムにアトリビュートを書き出したり、出力結果を取り付けることもできます。 このコールバックは、メインHoudiniプロセス内でバックグラウンドスレッド上で実行されます。

Python Scriptノードは、 Evaluate In Process が有効に設定されていると、このコールバックを使ってスクリプトを実行します。

onPostCookTask(work_item)pdg.result

このコールバックは、ワークアイテムがクックに成功した時、且つ、下流ノードがそのワークアイテムから何かを生成する前にコールされます。 これを使用することで、そのワークアイテムの出力ファイルまたはアトリビュートを検証したり、クック中に生成された出力ファイルに基づいてアトリビュートに変更を加えることができます。 このコールバックは、そのワークアイテムがIn-Processでクックされていなかった場合でも実行されます。 このコールバックがpdg.result.Failureを返すと、そのワークアイテムは失敗としてマークされます。

このコールバックは、pdg.WorkItem.setIsPostCookメソッドを使ってポストクックロジックを実行する必要性があるものとしてワークアイテムがマークされた場合にのみコールされます。

onSelectTask(work_item)pdg.result

これは、TOPs用途特有のUIコールバックです。 TOPs UI内でワークアイテムを選択する時、ワークアイテムが選択された後でこのフックが実行されます。 例えば、これをWedgeノードで使用することで、ワークアイテムパラメータ値をシーンに出すことができます。 他にも、独自の視覚化ロジックを実行することができます。

Note

ワークアイテム選択用のイベントフックもあります。 詳細は、pdg.EventTypeイベントタイプリストとイベントハンドリングの概要を参照してください。

onDeselectTask(work_item)pdg.result

このコールバックは、onSelectコールバックの反対です。 TOPs UIでワークアイテムが選択解除される度に実行されます。 例えば、Wedgeノードは、このコールバックを使用して、選択解除時にパラメータ値を元の値に復元します。

タスクを実行する方法

基本

初心者向けチュートリアル

次のステップ

リファレンス