2013-01-08 87 views
1

我正在分析一些多線程CPython的代碼。
爲了測量執行特定代碼段所需的時間,我想強制GIL (Global Interpreter Lock)而不是在該段的線程之間切換。如何才能做到這一點?強制GIL不要切換線程

UPDATE:
假設下面的僞代碼:

some_code_1() 
make_the_interpreter_not_change_thread() 
take_start_time() # time critical 
code_to_profile() # time critical 
take_end_time()  # time critical 
release_the_interpreter() 
some_code_2() 

我擔心的是,在「關鍵時刻」剖析時期解釋將切換線程。

回答

5

GIL不切換線程。 GIL是一個互斥體,它可以防止多個線程同時執行字節碼。因此,爲了防止線程切換,您需要查看其他地方。

您可以撥打sys.setcheckinterval(),這個值非常大,可以防止在您的代碼被分析時進行切換。

每當您撥打sys.setcheckinterval(count)時,當前的「計數器」將重置爲新值,因此只要您調用它,就不允許線程切換至少count字節碼指令。

+0

查看我的問題更新。在'make_the_interpreter_not_change_thread()'中通過'sys.setcheckinterval()'放置很大數量的工作?解釋器是否改變了python虛擬指令的當前計數,或者這個新值是否會影響解釋器檢查的下一個週期,這可能會在'code_to_profile()'過程中發生? – Jonathan

+1

@Jonathan:該函數在被調用時重置當前計數。所以用一個很大的值來調用它可以保證不會爲這些字節碼指令進行線程切換。 –