1个工作线程比4快?

时间:2014-12-11 13:12:58

标签: python multithreading

我正在阅读python中的多线程,并提出了这个简单的测试: (顺便说一句。这个实现可能非常糟糕,我只是为了测试目的而快速写下来。如果有一些可怕的错误我会感激你,如果你能指出这一点)

#!/usr/bin/python2.7

import threading
import timeit

lst = range(0, 100000)
lstres = []
lstlock = threading.Lock()
lstreslock = threading.Lock()

def add_five(x):
    return x+5

def worker_thread(args):
    print "started"
    while len(lst) > 0:
        lstlock.acquire()
        try:
            x = lst.pop(0)
        except IndexError:
            lstlock.release()
            return
        lstlock.release()
        x = add_five(x)
        lstreslock.acquire()
        lstres.append(x)
        lstreslock.release()

def test():
    try:
        t1 = threading.Thread(target = worker_thread, args = (1,))
        #t2 = threading.Thread(target = worker_thread, args = (2,))
        #t3 = threading.Thread(target = worker_thread, args = (3,))
        #t4 = threading.Thread(target = worker_thread, args = (4,))
        t1.start();
        #t2.start();
        #t3.start();
        #t4.start();
        t1.join();
        #t2.join();
        #t3.join();
        #t4.join();
    except:
        print "Error"

    print len(lstres)

if __name__ == "__main__":
    t = timeit.Timer(test)
    print t.timeit(2)

尽管有一个可怕的例子我看到以下内容:一个线程比4快。 我得到一个线程:13.46秒,有4个线程:25.47秒。

4个线程对列表的访问是否成为瓶颈,从而造成更慢的时间或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

在您的情况下,Global Interpreter Lock实际上并不是问题。

线程默认情况下不会让事情变得更快。在您的情况下,代码是CPU绑定的。没有线程在等待I / O(允许其他人使用CPU)。如果你的代码需要100%的CPU,那么线程只会使很多代码是独立的,而你的代码并不是很快:你的大部分代码都是锁,所以没有别的线程可以继续。

这让我们了解了放缓的原因:切换线程和争取锁定需要花费时间。在你的情况下,这就是吃12的东西。