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 软件包包含三个与线程相关的例程(有关 executeInMainThreadWithResult 的详细信息,请参见上一节)。
(类似于 maya.utils.executeInMainThreadWithResult(),只是它不等待返回值。)它会延迟执行给定脚本或函数,直到 Maya 处于空闲状态。该函数使用空闲事件循环运行代码。这意味着在执行该 Python 代码之前,主线程必须处于空闲状态。
有两种不同的方法可以调用该函数。第一种方法是提供包含要执行的 Python 代码的单个字符串参数。在这种情况下,会解释代码。第二种方法是通过将该例程传递给可调用对象来调用它。如果是这种情况,则其余的常规参数和关键字参数也会传递给可调用对象。