考虑到GIL,我预计这个程序会在9秒内完成,但令我惊讶的是,它以4秒结束。寻找可能的原因或我错过了什么?
import time
import threading
def get_data(start, end):
res = []
for i in range(start, end):
time.sleep(1)
res.append(i)
print res
range_list = [(1,4), (4,7), (6,10)]
for r in range_list:
t = threading.Thread(target=get_data, args = (r[0], r[1]))
t.start()
执行时间: -
没有线程 - 9秒
使用线程 - 4秒
答案 0 :(得分:1)
通常情况下,如果你不使用多线程,这个程序会在9秒内完成,因为python一个接一个地运行,所以当你输入time.sleep(1)时,python只需要等待一秒钟而另一方面不要任何东西。但是当你使用多线程时,程序会分别运行线程函数。因此,例如,如果您调用线程函数2次,则线程函数会在同一时间内逐行运行。
在此程序中,您将调用线程函数3次。第一次调用,python等待3秒,i = 1,i = 2,i = 3,第二次调用,python等待3秒,i = 4,i = 5,i = 6,最后调用python等待4秒,i = 6 ,I = 7,I = 8,I = 9。这些代码彼此分开运行,因此该程序在4秒内完成,因为最长时间是4秒。