1. 程式人生 > >GIL用C語言解決

GIL用C語言解決

執行一個單執行緒死迴圈程式,單核cpu佔用直接100%

while True:
    pass

 

執行一個雙執行緒的死迴圈程式,cpu同樣佔用100%

import threading

#子執行緒死迴圈
def test():
    while True:
        pass

t1=threading.Thread(target=test)
t1.start()

#主執行緒死迴圈
while True:
    pass

 

我們把cpu換成雙核之後再次執行雙執行緒死迴圈程式,發現每個cpu各佔50%,兩個加起來才是100%

 

我們在執行雙程序死迴圈程式,發現兩個cpu佔用都達到了100%

import multiprocessing

def deadLoop():
    while True:
        pass

#子程序死迴圈
p1=multiprocessing.Process(target=deadLoop)
p1.start()

#主程序死迴圈
deadLoop()

得出一個結論,python執行多工,執行緒沒有程序高,因為有GIL鎖,同一時刻只有一個執行緒會被呼叫,單核沒有區別,多核有明顯區別

 

c語言的應用

test.c檔案,程式碼如下

gcc test.c在當前目錄生成一個a.out檔案,./a.out在當前目錄執行a.out檔案,打印出c程式碼的結果

 

 

 

 

新建一個檔案寫如下程式碼,相當於python的while True:pass,分號相當於python中的pass,檔案以.c結尾,我這裡命名為loop.c

 

 

把c語言檔案編譯成一個動態庫的命令(linux平臺下)

gcc xxx.c -shared -o libxxxx.so

 

gcc loop.c -shared -o libdeadloop.so

在當前目錄生成一個libdeadloop.so檔案

 

main.py,在載入動態庫裡填寫剛才libdeadloop.so檔案的路徑

 

執行main檔案,成功多執行緒佔用多個cpu100%