在Ubuntu上的python 2.7中使用线程的意外并行行为

时间:2014-09-24 21:12:24

标签: python multithreading

我正在使用python 2.7在Ubuntu上运行这个非常简单的例子。

#!/usr/bin/python 

import threading

threads = []

def incrementCounter(tid):

    print("Thread " + str(tid) + " is starting")

    counter = 0;
    for i in range(5000000):
        counter = counter + 1

    print("Thread " + str(tid) + " is done")


def main():

    for i in range(24):
        t = threading.Thread(target=incrementCounter, args=(i, ))
        t.start();
        threads.append(t)

    for i in range(24):
        for t in threads:
         t.join()

if __name__ == '__main__':
    main()

我在拥有24核处理器的计算机上运行它。我运行它时没有线程并行性。当与此代码同时运行时,Vmstat显示CPU有95%的空闲时间。在顶部显示CPU利用率为150%,这意味着我们完全使用1.5核心。当我在主窗口中按Ctrl-C时,我的CPU利用率达到2398%,每个核心几乎达到100%。但是,运行vmstat会显示这是系统CPU使用率。使用的CPU是一位数。该计划需要永远完成。

当我用进程替换线程时,如:

p = Process(target=incrementCounter, args=(i, ))
p.start();
processes.append(p)

(以及所有其他预期的更改),我获得完全并行,程序即时完成。

似乎没有与线程的并行性。线程。 vmstat输出还显示了大量的中断和上下文切换,这表明线程正在按顺序运行。

任何人都知道发生了什么?

0 个答案:

没有答案