脚本 > Python > 

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 软件包包含三个与线程相关的例程(有关 executeInMainThreadWithResult 的详细信息,请参见上一节)。

以下是 maya.utils 中的另外两个例程: