代码之家  ›  专栏  ›  技术社区  ›  helloandre

用Python中的线程进行练习

  •  2
  • helloandre  · 技术社区  · 15 年前

    我知道巨蟒有 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秒以上的时间)。但是,当我尝试使用 threading 在python中,由于全局锁的存在,它需要两倍的时间。我的问题是,我是否应该放弃在Python的两个线程中进行此操作的所有希望,并尝试使用另一种语言?如果我可以继续前进,我应该使用什么模块?如果没有,我应该用什么语言做实验?

    5 回复  |  直到 15 年前
        1
  •  7
  •   Jay    15 年前

    python 2.6现在包括 mulitprocessing 模块(以前 processing 旧版本的python上的模块)。

    它与 螺纹加工 模块,但将执行启动到单独的进程中,而不是线程中。这使得python能够利用多个内核/cpu,并且与线程模块方法相比,它可以很好地扩展CPU密集型任务。

        2
  •  3
  •   John Fouhy    15 年前

    如果sobel操作符是CPU绑定的,那么您将无法从多个线程中获得任何好处,因为python没有利用多个核心。

    可以想象,您可以分离出多个进程,尽管我不确定这是否适用于处理单个图像。

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

        3
  •  2
  •   mikelikespie    15 年前

    我也推荐使用numpy。它不仅可能更快,而且如果使用线程,就不会有全局锁。

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

    不管怎样,如果你真的想练习线程,我建议你在C语言中玩pthreads。pthreads非常简单,可以用于基本情况,而且可以在所有地方使用。

        4
  •  0
  •   HUAGHAGUAH    15 年前

    像Sobel运算符这样的批量矩阵操作,通过(正确地)使用 Matlab/Octave . 有可能 NumPy 可以为矩阵/阵列操作提供类似的加速。

        5
  •  0
  •   Gert    15 年前

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