在python中线程化序列化操作比按顺序运行它们要慢

时间:2012-04-17 17:41:45

标签: python multithreading python-multithreading

我试图在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()

1 个答案:

答案 0 :(得分:4)

CPython有一个所谓的Global Interpreter Lock,这意味着即使多线程也只能运行一个Python语句。您可能希望查看multiprocessing,这可以避免此约束。

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