python因爲有全局解釋鎖(GIL)的緣由,Python 的線程被限制到同一時刻只容許一個線程執行這樣一個執行,因此妨礙了其真正的使用功效,可是對於IO型程序並無多少影響,後續說解決辦法python
線程(對於IO密集型程序能夠大幅提升程序運行速度,減小執行時間)spa
python3 目前推薦使用threading線程
import time start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) print('主程序{}運行'.format(name)) look_thread('1') look_thread('2') end = time.time() print(end-start)
這個是無線程運行後輸出的結果以及所花費的時間code
主程序1運行
主程序1運行
主程序1運行
主程序1運行
主程序1運行
主程序2運行
主程序2運行
主程序2運行
主程序2運行
主程序2運行
5.005494832992554
接下來看看使用線程後的程序orm
import threading import time from threading import Thread start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) # print('主程序{}運行'.format(name)) print("線程{}正在運行".format(name)) t1 = Thread(target=look_thread,args=('1',)) #建立線程1 t2 = Thread(target=look_thread,args=('2',)) #建立線程2 #t1 = Thread(target=look_thread,args=('1',),daemon=True) #若是不喜歡使用join能夠使用保護線程 #t2 = Thread(target=look_thread,args=('2',),daemon=True) #建立線程2 t1.start() #啓動線程1 t2.start() #啓動線程2 print(threading.active_count()) #現存線程數 t1.join() #將線程1加入到當前線程 t2.join() #將線程2加入到當前線程 print(threading.active_count()) #現存線程數 end = time.time() print(end-start) #運行時間
結果以下blog
3
線程1正在運行
線程2正在運行
線程1正在運行
線程2正在運行
線程1正在運行
線程2正在運行
線程1正在運行
線程2正在運行
線程1正在運行
線程2正在運行
1
2.504371404647827
2個對比能夠看出,明顯不是按照持續執行,且線程數的變化和運行時間的減半進程
進程(建議在cpu密集型程序使用)ip
python3 使用multiprocessing,使用方法同threadingget
import time from multiprocessing import Process start = time.time() def look_thread(name): for i in range(5): time.sleep(0.5) # print('主程序{}運行'.format(name)) print("進程{}正在運行".format(name)) if __name__ == "__main__": t1 = Process(target=look_thread,args=('1',)) t2 = Process(target=look_thread,args=('2',)) t1.start() t2.start() t1.join() t2.join() end = time.time() print(end-start)
結果以下form
進程1正在運行
進程2正在運行
進程2正在運行進程1正在運行
進程1正在運行
進程2正在運行
進程1正在運行進程2正在運行
進程2正在運行
進程1正在運行
2.7984180450439453
參考書籍:python3-cookbook