【问题标题】:How to use python (maya) multithreading如何使用 python (maya) 多线程
【发布时间】:2013-05-15 12:00:44
【问题描述】:

我一直在查看其他人的示例,但似乎无法使其正常工作。
它要么使用一个核心,要么如果处理太多,基本上会冻结 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 还比较陌生,因此非常感谢您提供示例

干杯:)

【问题讨论】:

  • 也许这个答案可以帮助你stackoverflow.com/questions/16470004/…
  • 谢谢,但这主要是针对数据库的,而且我之前确实看过那个 python 文档页面,但它不适用于 maya:P
  • 需要更长时间的代码会去哪里?在某处添加对某个函数 f 的调用,以使其更清楚它需要哪些参数。您想同时处理newvalue 列表,对吗?
  • @Peter 下面的答案是一个很好的答案;尤其是需要的 cmets。我会接受的:)
  • 啊,好吧,我现在就做,我认为这是我在这里的第一个问题,所以这是我忘记的借口:P(我也有点失望,玛雅不能轻易使用多核哈哈)

标签: python maya pymel


【解决方案1】:

对此确实有两种不同的答案。

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 解释器,global interpreter lock 意味着它们最终会等待它而不是运行独立进行。

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

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

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

【讨论】:

  • 感谢您的回复,刚刚尝试了您的代码,它似乎是少数与 maya 一起工作的代码之一,哈哈,但基本上,您是说不可能使其成为多线程的吗?它只是我拥有的一个插件,它有一个多线程选项(但它是一个求解器,因此如果启用它,它会发出非常不同的结果),而且这是一个专有的 Maya 插件,所以这些人肯定已经找到了解决它的方法吗?
  • 我正在区分线程(maya 产生大量线程)和多处理以响应 OP 的问题。 Maya 使用 OpenMP 为某些事情(尤其是模拟)获取更多核心,但我认为核心 DAG 图评估不会跨核心传播。例如,在播放具有多个复杂装备的场景时,我当然不会在多个内核上看到处理器峰值。相比之下,XSI ICE 完全是多处理器(或者至少,这是他们声称的)。这里有一些文档:docs.autodesk.com/MAYAUL/2013/ENU/Maya-API-Documentation/…
  • 问题是只有很少的节点做如此繁重而重要的事情。对于 Maya,限制因素是 ogl 更新。如果您禁用 mayas ogl,您将看到 maya 的混合形状和骨骼的尖峰更多。所以增益实际上是无穷小的。 dg 有点多线程,但可惜 Autodesk 中途停止了开发。老实说,所有当前的 3d 应用程序都受到旧架构的影响。甚至 XSI 也好不了多少。因此,您需要第二代软件才能对此进行任何有意义的改变。如果您想讨论更多内容,请将其移至讨论。
  • 在 Maya Python 中,它对于您不想阻塞 UI 的任何事情都很方便(例如,与数据库交谈或在导出时启动后处理)。其他任何东西——特别是如果你正在做大量的数字运算——通过 C++。
  • C++ 必须作为插件编写。 SDK 随您的 maya 安装以及文档和示例一起提供 - 但我尽可能避免使用它,因为除其他外,您需要针对不同版本的 maya 和位深度重新编译。
【解决方案2】:

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

【讨论】:

  • 如果操作得当且仔细,这是一个好主意,但作为警告,我工作的地方在 animbot 的崩溃恢复中遇到了一些问题。打开场景时它会产生一个新进程,但永远不会关闭它。退出 Maya 后,每个进程都会失去连接,并会占用一个完整的 CPU 内核以试图再次找到它。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多