【发布时间】:2011-07-10 15:04:31
【问题描述】:
我正在制作一个调用 Imagemagick 和 ffmpeg 的 PyQt4 应用程序,但完成任务需要太多时间,我想知道是否有办法为此实现线程,该应用程序将在多核机器上运行,还有一些我见过的方法都不够有效。提前致谢
【问题讨论】:
标签: multithreading ffmpeg imagemagick pyqt4 python-2.6
我正在制作一个调用 Imagemagick 和 ffmpeg 的 PyQt4 应用程序,但完成任务需要太多时间,我想知道是否有办法为此实现线程,该应用程序将在多核机器上运行,还有一些我见过的方法都不够有效。提前致谢
【问题讨论】:
标签: multithreading ffmpeg imagemagick pyqt4 python-2.6
答案是肯定的和否定的 - 您可以使用 QThread 进行线程处理,但您仍需遵守 GIL,因此您的线程将串行运行。
您可以尝试使用多处理在其自己的进程中创建一个工作类并将工作发送给它(或让它从队列中窃取工作),但是这可能会在复制对象和在进程之间发送对象时引入其自身的性能损失。 ..
重新阅读您的问题后,看起来 Imagemagick 和 ffmpeg 是外部可执行文件,在这种情况下,GIL 在您等待进程执行时被释放。我能问一下你是如何运行这些的吗?我倾向于发现创建工作队列和事件循环会更好。每次在事件循环中,您都会检查正在运行的进程是否已完成,然后获取它们的输出。对于这个 subprocess.Popen 比 os.command 更有用。
如果您使用 QTimer,您可以利用 QApplication 的事件循环,它还有一个额外的好处是允许您的 GUI(假设您有一个)在滴答之间刷新。
【讨论】: