Python中的线程练习
我知道Python有一个global lock,我读过了Glyph的python multithreading的解释。但我仍然想尝试一下。我决定做一个简单的(概念上的)任务是对图片进行水平和垂直边缘检测。Python中的线程练习
这里发生了什么(伪):
for pixels in picture:
apply sobel operator horizontal
for pixels in picture:
apply sobel operator vertical
这两个循环可以完全独立运行,因此会成为多线程的主要候选对象。 (在任何非常大的图片上运行这两个循环可能需要10秒以上)。但是,当我尝试在python中使用threading
模块时,由于全局锁定而需要两倍的时间。我的问题是,我是否应该放弃所有希望在python的两个线程中执行此操作并尝试使用另一种语言?如果我可以开拓进取,我应该使用哪些模块?如果不是,我应该用什么语言进行实验?
Python 2.6现在包含mulitprocessing模块(以前的老版本的Python为processing模块)。
它具有与线程模块基本相同的界面,但将执行启动到单独的进程而不是线程。这使得Python可以利用多个内核/ CPU,并且与线程模块方法相比,可以很好地扩展CPU密集型任务。
如果sobel运算符是CPU绑定的,那么您将不会从多个线程中获益,因为python没有利用多个内核。
可以想象,您可以分离多个进程,但我不确定这对于处理单个映像是否可行。
10秒似乎没有太多时间浪费。如果您担心时间,因为您将处理许多图像,那么运行多个进程并使每个进程处理单独的图像子集可能更容易。
我推荐使用NumPy。它不仅会更快,而且如果你使用它的线程,将不会有全局锁。
我也会建议像Jay所说的那样使用多处理技术。不管怎么说,如果你真的想练习穿线,我会建议你用C中的PThreads来玩。PThreads对于基本的例子来说非常简单,并且可以在整个地方使用。
如果你想用Python练习并行编程,Python多处理是正确的选择。如果您没有Python 2.6(如果您使用的是Ubuntu,那么您不需要),那么您可以使用Google code backported版本的多处理。它是PyPI的一部分,这意味着您可以使用EasyInstall(它是Ubuntu中的python-setuptools软件包的一部分)轻松安装它。
多处理/处理模块为您处理多个进程和IPC,并且允许比CPU密集型任务的传统Python线程更好地扩展。 – Jay 2009-02-11 04:11:52