Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 允许父应用程序仍进行计算的time.sleep?_Python_Maya - Fatal编程技术网

Python 允许父应用程序仍进行计算的time.sleep?

Python 允许父应用程序仍进行计算的time.sleep?,python,maya,Python,Maya,我最近在为Maya和Houdini编写脚本时遇到过这样的情况:在调用Python代码的其余部分之前,我需要等待GUI方面的更新。我在想,在这两种情况下调用time.sleep都可以解决我的问题,但似乎time.sleep也会阻塞父应用程序。这意味着我的脚本的计算结果是完全相同的,不管睡眠是否在其中,它只是中途暂停 我想用Python在一个单独的线程中运行我的脚本,看看这是否会让应用程序在睡眠期间仍然运行,但我还没有时间测试这个 我想在此期间我会问,是否有人知道这个场景的其他解决方案。一个更好的解

我最近在为Maya和Houdini编写脚本时遇到过这样的情况:在调用Python代码的其余部分之前,我需要等待GUI方面的更新。我在想,在这两种情况下调用time.sleep都可以解决我的问题,但似乎time.sleep也会阻塞父应用程序。这意味着我的脚本的计算结果是完全相同的,不管睡眠是否在其中,它只是中途暂停

我想用Python在一个单独的线程中运行我的脚本,看看这是否会让应用程序在睡眠期间仍然运行,但我还没有时间测试这个


我想在此期间我会问,是否有人知道这个场景的其他解决方案。

一个更好的解决方案,而不是睡眠,是一个while循环。设置while循环以检查共享值(甚至是线程安全结构,如队列)。您等待的父进程可以执行其工作(或子进程,谁生成什么并不重要),当它们完成工作时,会向队列/变量发送真/假/0/1/任何内容,让其他进程知道它们可以继续。

Maya—或者更准确地说,Maya Python—不是真正的多线程(Python本身有一种狡猾的多线程,因为所有线程都在为恐惧而战,但这不是您的问题)。您可以使用线程模块在Maya中运行线程化代码;请尝试:

import time
import threading
def test():
   for n in range (0, 10):
       print "hello"
       time.sleep(1)
 t = threading.Thread(target = test)
 t.start()
这将在不关闭交互的情况下,以1秒的间隔向您的听众打印10次“hello”

不幸的是,maya的许多部分(包括最明显的所有用户创建的UI和大多数类型的场景操纵)只能从“主”线程(拥有maya UI的线程)运行。因此,您无法使用上述技术执行脚本来更改窗口中文本框的内容(更糟糕的是,您会收到误导性的错误消息—从侦听器运行时有效的代码,但从线程调用时出错,并礼貌地返回完全错误的错误代码)。您可以在单独的线程中执行网络通信、写入文件或长时间计算等操作。没问题,但如果您尝试从线程中执行UI工作和许多常见场景任务,它们将失败

Maya在模块中对此有部分解决方法。您可以使用ExecuteFerred和executeInMainThreadWithResult函数。这些函数将等待空闲时间运行(例如,这意味着,如果您正在播放动画,它们将不会运行)然后像在主线程中那样启动。maya文档中的示例给出了以下想法:

import maya.utils import maya.cmds
def doSphere( radius ):
    maya.cmds.sphere( radius=radius )
maya.utils.executeInMainThreadWithResult( doSphere, 5.0 )
这可以满足您的大部分需求,但您需要仔细考虑如何将任务分解为线程友好的块。当然,运行线程程序总是比单线程程序更难,您需要设计代码,以便在您工作时,如果另一个线程干扰了某个变量,则不会出现问题。好的并行编程是一个很大的难题,尽管归结为两个基本思想:

1) 在需要时使用对对象建立独占控制(对于短期操作) 2) 将共享数据放入安全容器中,如@dylan示例中的队列 3) 明确哪些对象是可共享的(应该很少!),哪些不是

这是


至于Houdini,我不确定,但听起来似乎也出现了类似的问题。

我有一个想法,用Python在一个单独的线程中运行我的脚本,看看这是否会让应用程序在睡眠期间仍然运行,但我还没有时间测试它。
是的,这就是并发性的实现方式。线程很好。多处理也是如此。我不确定的是,它是否仍然允许父应用程序继续处理。这将是在Python脚本中创建的一个新线程,因此我猜这仍然会像以前一样束缚Maya/Houdini,但允许处理多个Python代码流。我很快会测试的。初始测试在Maya中看起来不错。我认为这是可行的。酷!谢谢各位,它确实解决了眼前的问题。但是,在线程中运行以前的工作脚本现在给了我一些错误,因为在CGTalk上找到了与问题相关的此线程“#TypeError:Flag'force'必须传递一个布尔参数”。。谢谢非常详细的回答。这正是我昨天在线程模块路线上遇到的障碍。获取大量有关布尔值无效的错误消息。尚未找到解决方案,但稍后我将探索您给出的maya.utils示例。我已经研究过这个问题了,我会回到这个问题上来,因为我认为这是一个很好的关于未来的常识。再次感谢。只是想添加,在Houdini中使用线程模块效果非常好。Maya是唯一一个对线程处理感到古怪的人。