在python中练习线程

时间:2009-02-11 03:42:34

标签: python multithreading image-manipulation

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

这是发生了什么(伪代码):

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

info on sobel operator

这两个循环可以完全独立地运行,因此是多线程的主要候选者。 (在任何非常大的图片上运行这两个循环可能需要10秒以上)。但是,当我尝试在python中使用threading模块时,由于全局锁定,它需要两倍的时间。我的问题是,我是否应该放弃在python的两个线程中执行此操作并尝试使用其他语言的所有希望?如果我能够继续前进,我应该使用哪些模块?如果没有,我应该用什么语言进行实验?

5 个答案:

答案 0 :(得分:7)

Python 2.6现在包含mulitprocessing模块(旧版本的Python上的processing模块)。

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

答案 1 :(得分:3)

如果sobel运算符受CPU限制,那么你将无法从多个线程中获益,因为python没有利用多个核心。

可以想象你可以分离多个进程,但我不确定这对于处理单个图像是否合适。

10秒似乎没有浪费很多时间。如果你因为处理很多图像而担心时间,那么运行多个进程并让每个进程处理一个单独的图像子集可能会更容易。

答案 2 :(得分:2)

我建议也使用NumPy。它不仅可能更快,而且如果您使用线程,则不会有全局锁定。

我还建议使用Jay处理的多处理方式。

无论如何,如果你真的想要练习线程,我建议在C中使用PThreads。对于基本情况,使用PThreads非常简单,并且在整个地方使用。

答案 3 :(得分:0)

像Sobel算子这样的批量矩阵运算肯定会通过(正确)使用Matlab/Octave来实现显着的速度提升。 NumPy可能为矩阵/数组操作提供类似的加速。

答案 4 :(得分:0)

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