2016-07-23 140 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密集型)所取代,即使使用多線程,執行時間也不會減少。 –