Python中的线程练习

问题描述:

我知道Python有一个global lock,我读过了Glyph的python multithreading的解释。但我仍然想尝试一下。我决定做一个简单的(概念上的)任务是对图片进行水平和垂直边缘检测。Python中的线程练习

这里发生了什么(伪):

for pixels in picture: 
    apply sobel operator horizontal 
for pixels in picture: 
    apply sobel operator vertical 

info on sobel operator

这两个循环可以完全独立运行,因此会成为多线程的主要候选对象。 (在任何非常大的图片上运行这两个循环可能需要10秒以上)。但是,当我尝试在python中使用threading模块时,由于全局锁定而需要两倍的时间。我的问题是,我是否应该放弃所有希望在python的两个线程中执行此操作并尝试使用另一种语言?如果我可以开拓进取,我应该使用哪些模块?如果不是,我应该用什么语言进行实验?

Python 2.6现在包含mulitprocessing模块(以前的老版本的Python为processing模块)。

它具有与线程模块基本相同的界面,但将执行启动到单独的进程而不是线程。这使得Python可以利用多个内核/ CPU,并且与线程模块方法相比,可以很好地扩展CPU密集型任务。

如果sobel运算符是CPU绑定的,那么您将不会从多个线程中获益,因为python没有利用多个内核。

可以想象,您可以分离多个进程,但我不确定这对于处理单个映像是否可行。

10秒似乎没有太多时间浪费。如果您担心时间,因为您将处理许多图像,那么运行多个进程并使每个进程处理单独的图像子集可能更容易。

+0

多处理/处理模块为您处理多个进程和IPC,并且允许比CPU密集型任务的传统Python线程更好地扩展。 – Jay 2009-02-11 04:11:52

像索贝尔操作员那样的大规模矩阵操作将通过(正确地)使用Matlab/Octave确实实现显着的速度增益。 NumPy可能会为矩阵/阵列操作提供类似的加速。

我推荐使用NumPy。它不仅会更快,而且如果你使用它的线程,将不会有全局锁。

我也会建议像Jay所说的那样使用多处理技术。不管怎么说,如果你真的想练习穿线,我会建议你用C中的PThreads来玩。PThreads对于基本的例子来说非常简单,并且可以在整个地方使用。

如果你想用Python练习并行编程,Python多处理是正确的选择。如果您没有Python 2.6(如果您使用的是Ubuntu,那么您不需要),那么您可以使用Google code backported版本的多处理。它是PyPI的一部分,这意味着您可以使用EasyInstall(它是Ubuntu中的python-setuptools软件包的一部分)轻松安装它。