1. 程式人生 > >Python隨筆(二)GIL

Python隨筆(二)GIL

開發十年,就只剩下這套架構體系了! >>>   

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