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 中的另外两个例程:    

  • maya.utils.processIdleEvents()。它主要用于测试:强制处理任何排队等待的空闲事件。                

  • maya.utils.executeDeferred()。                  

    (类似于 maya.utils.executeInMainThreadWithResult(),只是它不等待返回值。)它会延迟执行给定脚本或函数,直到 Maya 处于空闲状态。该函数使用空闲事件循环运行代码。这意味着在执行该 Python 代码之前,主线程必须处于空闲状态。                  

    有两种不同的方法可以调用该函数。第一种方法是提供包含要执行的 Python 代码的单个字符串参数。在这种情况下,会解释代码。第二种方法是通过将该例程传递给可调用对象来调用它。如果是这种情况,则其余的常规参数和关键字参数也会传递给可调用对象。                  


,