2016-07-23 16 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

'sleep'はGILを解放します。 http://stackoverflow.com/questions/1205328/scheduling-issues-in-python – cdarke

+0

ok、thanks @cdarkeを参照してください。これは役に立ちます。 –

答えて

1

通常は、9秒ために、このプログラムの仕上げをマルチスレッド使用しない場合のpythonあなたがtime.sleep(1)を置くとき、pythonはちょうど1秒待って、もう一方は何もしません。しかし、マルチスレッドを使用すると、プログラムはスレッド関数を別々に実行します。たとえば、スレッド関数を2回呼び出すと、スレッド関数は同時に別々に実行されます。

このプログラムでは、スレッド関数を3回呼び出します。最初の呼び出し、pythonはi = 1、i = 2、i = 3、2回目の呼び出しでは3秒待機、pythonはi = 4、i = 5、i = 6、最終呼び出しのPythonはi = 6 、i = 7、i = 8、i = 9。このコードは互いに独立して実行されるので、このプログラムは4秒で終了します。最大の時間は4秒です。

+0

応答ありがとうございますが、ここで間違っています。 Pythonスレッドは他の言語と同じように動作しません。 GILはスレッドをこのように実行させません。それをスキップしたのはタイムシンプルな方法です。すべてのtime.sleepが実行に1秒かかる重い計算(CPU集約)に置き換えられた場合、マルチスレッドを使用しても実行時間は短縮されません。 –

関連する問題