1

我试图在 python 中同时运行两个长时间运行的操作。它们都对相同的数据集进行操作,但不对其进行修改。我发现线程实现的运行速度比简单地一个接一个地运行要慢。

我创建了一个简化的示例来展示我正在经历的事情。

运行此代码并注释第 46 行(使其执行线程操作),导致我的机器上的运行时间约为 1:01(分:秒)。我看到两个 CPU 在整个运行时间内以大约 50% 的速度运行。

注释掉第 47 行(导致顺序计算)会导致运行时间约为 35 秒,其中 1 个 CPU 在整个运行时间中固定为 100%。
两次运行都导致完成了两个完整的计算。

from datetime import datetime
import threading


class num:
    def __init__(self):
        self._num = 0

    def increment(self):
        self._num += 1

    def getValue(self):
        return self._num

class incrementNumber(threading.Thread):
    def __init__(self, number):
        self._number = number
        threading.Thread.__init__(self)

    def run(self):
        self.incrementProcess()

    def incrementProcess(self):
        for i in range(50000000):
            self._number.increment()


def runThreaded(x, y):
    x.start()
    y.start()
    x.join()
    y.join()

def runNonThreaded(x, y):
    x.incrementProcess()
    y.incrementProcess()

def main():
    t = datetime.now()

    x = num()
    y = num()
    incrementX = incrementNumber(x)
    incrementY = incrementNumber(y)

    runThreaded(incrementX, incrementY)
    #runNonThreaded(incrementX, incrementY)


    print x.getValue(), y.getValue()
    print datetime.now() - t


if __name__=="__main__":
    main()
4

1 回答 1

4

CPython 有一个所谓的Global Interpreter Lock,这意味着即使在多线程时,一次也只能运行一条 Python 语句。您可能想研究multiprocessing,它可以避免这种约束。

GIL 意味着 Python 多线程仅适用于 I/O 绑定操作、其他等待事情发生的事情,或者如果您正在调用 C 扩展以在工作时释放 GIL。

于 2012-04-17T17:44:13.773 回答