python3 線程、進程

線程、進程

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

相關文章
相關標籤/搜索