如何使用Python (maya) 多线程

2024-10-01 00:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

举个例子,这就是我想要它做的,在一个非常基本的层面上。主要是让每个循环在不同的处理器上以不同的值同时运行(在本例中,这两个值将使用两个处理器)

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还是比较陌生的,所以一个示例会非常受欢迎

干杯:)


Tags: intrue核心forlenifexistsrange
2条回答

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

对此有两种不同的答案。

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中还有另一个方法允许调用线程等待响应)。这是一张link to the maya documentation on this module

然而,这并不能让你绕过问题的第二个方面。Maya python不会为您在处理器之间分割作业:threading将允许您创建单独的线程,但它们都共享同一python intepreter,global interpreter lock将意味着它们最终会等待它,而不是单独运行。

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

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

另外,顺便说一下,不能在批处理模式下使用executeferred等,因为它们是使用主UI循环实现的。

相关问题 更多 >