我正在阅读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个线程对列表的访问是否成为瓶颈,从而造成更慢的时间或者我做错了什么?
答案 0 :(得分:2)
在您的情况下,Global Interpreter Lock实际上并不是问题。
线程默认情况下不会让事情变得更快。在您的情况下,代码是CPU绑定的。没有线程在等待I / O(允许其他人使用CPU)。如果你的代码需要100%的CPU,那么线程只会使很多代码是独立的,而你的代码并不是很快:你的大部分代码都是锁,所以没有别的线程可以继续。
这让我们了解了放缓的原因:切换线程和争取锁定需要花费时间。在你的情况下,这就是吃12的东西。