Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Multithreading PyQt4中的线程_Multithreading_Ffmpeg_Imagemagick_Pyqt4_Python 2.6 - Fatal编程技术网

Multithreading PyQt4中的线程

Multithreading PyQt4中的线程,multithreading,ffmpeg,imagemagick,pyqt4,python-2.6,Multithreading,Ffmpeg,Imagemagick,Pyqt4,Python 2.6,我正在制作一个PyQt4应用程序,它调用Imagemagick和ffmpeg,但完成任务需要花费太多的时间,我想知道是否有办法实现线程,该应用程序将在多核机器上运行,我看到的一些方法效率不够。提前感谢答案是“是”和“否”-您可以使用QThread进行线程处理,但仍受GIL的约束,因此您的线程将以串行方式运行 您可以尝试使用多处理在自己的进程中创建一个worker类并将工作发送给它,或者让它从队列中窃取工作,但是这可能会在复制对象和在进程之间发送对象时引入自身的性能损失 重新阅读您的问题后,看起来

我正在制作一个PyQt4应用程序,它调用Imagemagick和ffmpeg,但完成任务需要花费太多的时间,我想知道是否有办法实现线程,该应用程序将在多核机器上运行,我看到的一些方法效率不够。提前感谢

答案是“是”和“否”-您可以使用QThread进行线程处理,但仍受GIL的约束,因此您的线程将以串行方式运行

您可以尝试使用多处理在自己的进程中创建一个worker类并将工作发送给它,或者让它从队列中窃取工作,但是这可能会在复制对象和在进程之间发送对象时引入自身的性能损失

重新阅读您的问题后,看起来Imagemagick和ffmpeg是外部可执行文件,在这种情况下,当您等待进程执行时,会释放GIL。我能问一下你是怎么运行这些的吗?我倾向于创建一个工作队列和一个事件循环。每次在事件循环中检查正在运行的进程是否已完成,然后获取它们的输出。对于此子流程,Popen比os.command更有用


如果您使用QTimer,您可以利用QApplication的事件循环,这还有一个额外的好处,即允许您的GUI在两个刻度之间进行刷新。

这也许可以解释这一点,我不确定,但我认为这与运行命令相同。运行-尝试使用命令。启动,否则您不会拆分为新线程,但是在当前线程中执行该对象。