Python隨筆(二)GIL
阿新 • • 發佈:2019-03-30
GIL(global interpreter lock)是Python一個非常讓人蛋疼的問題,它的存在直接影響了對Python併發執行緒的效能調優。 這裡我搬一個測試出來看看執行時間
from threading import Thread import time times=5 num=99999999#8個9 def counter(): i = 0 for _ in range(num): i = i + 1 return True def test_counter_1(): thread_array = {} start_time = time.time() for tid in range(times): thread = Thread(target=counter) thread.start() thread.join() end_time = time.time() print("單執行緒用時: {}".format(end_time - start_time)) def test_counter_2(): thread_array = {} start_time = time.time() for tid in range(times): thread = Thread(target=counter) thread.start() thread_array[tid] = thread for i in range(times): thread_array[i].join() end_time = time.time() print("多執行緒用時: {}".format(end_time - start_time)) if __name__ == '__main__': test_counter_1() test_counter_2()
test_counter_1是單執行緒執行五次test_counter_2是5個執行緒"同時"執行
看看我們的輸出
和預想中的不一樣,5個執行緒同時執行,相當於每條執行緒只執行一次,缺比單執行緒五次多了整整1S多執行緒多出了單執行緒103%的時間
同樣的思想我們來看看C++的執行結果
// // Created by Pulsar on 2019/3/30. // #include <pthread.h> #include <iostream> #include <ctime> void *counter(void *arg){ long long i = 0; for(;i<99999999;){ i+=1; } // std::cout<<"[INFO] Counter Done"<<std::endl; return nullptr; } int main(int argc,char **argv){ clock_t start_time_1,end_time_1,start_time_2,end_time_2; start_time_1=clock(); // 單執行緒多次執行 for(int i=0;i<5;i+=1){ counter(nullptr); } end_time_1=clock(); std::cout<<"Singal Thread Time:"<<(double)(end_time_1-start_time_1)/CLOCKS_PER_SEC<<std::endl; // 多執行緒一次執行 start_time_2=clock(); pthread_t thread_id_array[5]; for(int i=0;i<5;i+=1){ int error =pthread_create(&thread_id_array[i],NULL,counter,NULL); if(error!=0){ std::cout<<"[INFO] Thread Create Error"<<std::endl; } } for(int i=0;i<5;i+=1){ pthread_join(thread_id_array[i],NULL); } end_time_2=clock(); std::cout<<"Muti Thread Time:"<<(double)(end_time_2-start_time_2)/CLOCKS_PER_SEC<<std::endl; getchar(); return 0; }
真是令人頭禿,沒有對比沒有傷害
參考文獻:
[python中的GIL詳解]https://www.cnblogs.com/SuKiWX/p/8804974.html
[GlobalInterpreterLock]https://wiki.python.org/moin/GlobalInterpreterLock
[python-global-interpreter-lock]https://docs.python.org/3/c-api/init.html#thread-state-and-the-global