2

我一直在看其他人的例子,但我似乎无法让它正常工作。
它要么使用一个核心,要么如果处理太多,基本上会冻结maya,但我似乎从来没有让一个以上的核心同时工作。

例如,这是我希望它在非常基本的层面上做的事情。主要是让每个循环在具有不同值的不同处理器上同时运行(在这种情况下,两个值将使用两个处理器)

mylist = [50, 100, 23]

newvalue = [50,51]

for j in range(0, len(newvalue)):

    exists = False
    for i in range(0, len(mylist)):

        #search list
        if newvalue[j] == mylist[i]:
            exists = True

    #add to list
    if exists == True:
        mylist.append(mylist)

有可能把它拉下来吗?我想要使​​用它的实际代码每个循环可能需要几秒钟到 10 分钟,但理论上它们可以同时运行,所以我认为多线程会加快加载速度

请记住,我对 python 还比较陌生,所以一个例子将不胜感激

干杯:)

4

2 回答 2

5

这个问题真的有两种不同的答案。

Maya 脚本确实应该在主 UI 线程中运行,如果从单独的线程中运行,它们可能会以多种方式绊倒您。Maya 包含一个名为的模块,该模块maya.utils包含用于在主线程中进行延迟评估的方法。这是一个简单的例子:

import maya.cmds as cmds
import maya.utils as utils
import threading

def do_in_main():
    utils.executeDeferred (cmds.sphere)

for i in range(10):
    t  = threading.Thread(target=do_in_main, args=())
    t.start()

这将允许您从单独的线程中使用 maya ui 执行操作(utils 中还有另一种方法允许调用线程也等待响应)。这是此模块上的 Maya 文档的链接

但是,这并不能解决问题的第二个方面。Maya python 不会为您在处理器之间拆分工作:threading将让您创建单独的线程,但它们都共享相同的 python 解释器,全局解释器锁将意味着它们最终等待它而不是独立运行。

您不能使用该multiprocessing模块,至少不能使用 AFAIK,因为它会生成新的 Maya,而不是将脚本执行推送到您正在运行的 Maya 中的其他处理器中。抛开 Python 不谈,Maya 是一个老程序,无论如何都不是面向多核的。试试 XSI :)

在任何情况下,Maya 中的任何线程处理都是棘手的 - 如果您在没有上述延迟执行的情况下触摸主应用程序(基本上是来自 API 或 maya.whatever 模块的任何函数),您可能会使 Maya 崩溃。仅在必要时使用它。

而且,顺便说一句,您不能在批处理模式下使用 executeDeferred 等,因为它们是使用主 UI 循环实现的。

于 2013-05-21T03:20:31.627 回答
1

六年后的今天,西正教所说的仍然正确。但是,可以通过使用 subprocess 模块生成新进程来走另一条路。由于新进程位于单独的解释器中,因此您必须通过套接字或类似的东西进行通信和共享数据。新的解释器独立运行并且不了解 Maya,但您可以在其中执行任何其他工作,以受益于您的操作系统提供的多线程环境,然后再将其传送回您的 Maya python 脚本。

于 2019-08-06T23:07:55.900 回答