Python 言語はビルトインのスレッディング サポートを備えています。この機能は Maya でも使用可能ですが、Python 開発者が知っておくべき重要な制限事項がいくつかあります。
Maya API と Maya コマンドのアーキテクチャはスレッド セーフではありません。Maya コマンドは、メイン スレッドの外部からコールされた場合には例外をスローし、メインでないスレッドから OpenMaya API を使用すると、予期しない結果が発生します。
このような制限はあっても、Python でのスレッディングを Maya のコンテキストで使用する可能性が多々あります。たとえば、スレッドを発生させてソケットの入力を監視することができます。Python スレッドをより便利に利用するために、他のスレッドがメイン スレッドでコードを実行し、結果を待機する方法が提供されています。
maya.utils.executeInMainThreadWithResult() 関数は、Python コードを含む文字列、または関数などの Python がコール可能なオブジェクトのいずれかを受け取ります。後者の場合、executeInMainThreadWithResult() は実行中に、コール可能オブジェクトに渡された通常の引数とキーワード引数の両方も受け取ります。
スクリプトまたはコール可能オブジェクトは、次のアイドル イベント時にメイン スレッドで実行されます。executeInMainThreadWithResult() をコールしているスレッドは、メイン スレッドがアイドルになりコードを実行するまでブロックされます。メイン スレッドがコードの実行を終了すると、executeInMainThreadWithResult() は結果を返します。executeInMainThreadWithResult() は、メイン スレッドからコールされた場合、ただちにコードを実行して結果を返します。
アイドル イベントは、executeInMainThreadWithResult() を実行するために使用されているため、バッチ モードでは使用できません。
import maya.utils import maya.cmds def doSphere( radius ): maya.cmds.sphere( radius=radius ) maya.utils.executeInMainThreadWithResult( doSphere, 5.0 )
maya.utils パッケージには、API またはコマンドのいずれにも固有でないユーティリティ ルーチンが格納されます。このモジュールは将来のバージョンで拡張される可能性があります。
現在、maya.utils パッケージにはスレッディングに関する 3 つのルーチンが含まれています(詳細については、前のセクション「executeInMainThreadWithResult」を参照してください)。
maya.utils にはあと 2 つのルーチンがあります。
(maya.utils.executeInMainThreadWithResult() と似ていますが、この関数は戻り値を待機しません。)Maya がアイドルになるまで、入力したスクリプトまたは関数の実行を遅らせます。この関数は、アイドル イベント ループを使用してコードを実行します。つまり、この Python コードを実行するには、メイン スレッドがまずアイドルになる必要があります。
この関数をコールする方法は 2 つあります。1 つは、実行する Python コードを含む単一の文字列引数を指定することです。この場合、コードは解釈されます。このルーチンをコールする 2 つ目の方法は、この関数にコール可能オブジェクトを渡すことです。この場合、残りの通常の引数とキーワード引数はコール可能オブジェクトに渡されます。