Python とスレッディング

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

maya.utils パッケージには、API またはコマンドのいずれにも固有でないユーティリティ ルーチンが格納されます。このモジュールは将来のバージョンで拡張される可能性があります。

現在、maya.utils パッケージにはスレッディングに関する 3 つのルーチンが含まれています(詳細については、前のセクション「executeInMainThreadWithResult」を参照してください)。

maya.utils にはあと 2 つのルーチンがあります。