提高效率之python的多執行緒
阿新 • • 發佈:2018-12-16
python本身的設計對多執行緒的執行有所限制。為了資料安全設計有GIL全域性直譯器鎖。在python中,一個執行緒的執行包括獲取GIL、執行程式碼直到掛起和釋放GIL。每次釋放GIL鎖,執行緒之間都會進行競爭,由拿到鎖的執行緒進入cpu執行,所以由於GIL鎖的存在,python裡的一個程序永遠只能同時執行一個執行緒。
python的多執行緒 python的多執行緒實際上只是在執行的時候看起來像是併發的。
· 使用threading模組 import threading import datetime import time def dosomething(num): print('the number is',num) time.sleep(1) if __name__ == '__main__': starttime = datetime.datetime.now() list = [1,2,3,4,5,6,7,8,9,10] for i in list: dosomething(i) endtime = datetime.datetime.now() print('time used',endtime-starttime)
在不使用threading的模組下,由單執行緒執行上述程式碼用時10秒,每次sleep的過程都是在等待,效率低。
使用threading模組,在某個執行緒等待的時間執行其他執行緒,效率提升。(不足1秒的原因是,沒有加join,主執行緒先於其他執行緒執行完畢)
import threading import datetime import time def dosomething(num): print('the number is', num) time.sleep(1) if __name__ == '__main__': starttime = datetime.datetime.now() list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for i in list: threading.Thread(target=dosomething, args=(i,)).start() endtime = datetime.datetime.now() print('time used', endtime - starttime)
因此執行緒試用的場合之一就是非計算密集的場合,與其等待某個阻斷作業的完成,不如趁著等待時間來執行其他執行緒。