2016-07-23 103 views
0

考虑到GIL,我预计这个程序在9秒内完成,但令我惊讶的是,它在4秒内结束。寻找可能的原因还是我错过了什么?多线程python程序的执行时间

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() 

时间执行: -

不必穿线 - 9sec

螺纹加工 - 4秒

+1

由于您正在产生3个线程,并且它们都不使用共享资源,所以它们都将同时休眠并完成*,因此4秒是正确的。 – Ibrahim

+1

'睡眠'释放GIL。请参阅http://stackoverflow.com/questions/1205328/scheduling-issues-in-python – cdarke

+0

好的,谢谢@cdarke。这有助于。 –

回答

1

通常情况下,如果你不使用9秒,因为这个多线程程序完成蟒蛇一行一行地运行,所以当你放入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秒。

+0

感谢您的回应,但您在这里错了。 Python线程的工作方式与其他语言的工作方式不同。 GIL不会让线程以这种方式执行。这是跳过它的time.sleep方法。如果在任何时候.sleep被一个耗时1秒的繁重计算(CPU密集型)所取代,即使使用多线程,执行时间也不会减少。 –