python學習筆記(13):python併發程式設計以及系統常用模組
阿新 • • 發佈:2018-12-30
一、程序與執行緒
1.程序:程式的一次執行(程式裝載入記憶體,系統分配資源執行)。n 每個程序有自己的記憶體空間、資料棧等,只能使用程序間通訊,而不能直接共享資訊
2.執行緒:所有執行緒執行在同一個程序中,共享相同的執行環境。
(1)n 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口。
(2) 執行緒的執行可以被搶佔(中斷),或暫時被掛起(睡眠),讓其他執行緒執行(讓步)。n (3)一個程序中的各個執行緒間共享同一片資料空間。
二、全域性直譯器鎖GIL
1.GIL全稱全域性直譯器鎖Global Interpreter Lock,GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念
2.GIL是一把全域性排他鎖,同一時刻只有一個執行緒在執行。
(1) 毫無疑問全域性鎖的存在會對多執行緒的效率有不小影響。甚至就幾乎等於Python是個單執行緒的程式
(2)multiprocessing庫的出現很大程度上是為了彌補thread庫因為GIL而低效的缺陷。它完整的複製了一套thread所提供的介面方便遷移。唯一的不同就是它使用了多程序而不是多執行緒。每個程序有自己的獨立的GIL,因此也不會出現程序之間的GIL爭搶
# 順序執行多個單執行緒和同時執行多個併發執行緒效率比較,下面實現兩個執行緒順序執行 from threading import Thread import time def my_counter(): #定義一個順序數數的函式 i= 0 for _ in range(10000): i= i +1 return True def main(): thread_array={} start_time=time.time() for tid in range(2): t = Thread(target=my_counter) t.start() #同時開始兩個執行緒 thread_array[tid]=t for i in range(2): thread_array[tid] = t fori in range(2): thread_array[i].join() end_time=time.time() print("Total time:{}".format(end_time-start_time)) if __name__=='__main__': main()
from threading import Thread import time def my_counter(): i = 0 for _ in range(100000): i = i+1 return True def main(): thread_array={} start_time = time.time() for tid in range(2): # 兩個執行緒順序執行 t = Thread(target=my_counter) # 將數數的執行緒呼叫進來 t.start() t.join() end_time = time.time() print("Total time:{}".format(end_time-start_time)) if __name__=='__main__': main()
三、python多程序
fork操作:
n 呼叫一次,返回兩次。因為作業系統自動把當前程序(稱為父程序)複製了一份(稱為子程序),然後分別在父程序和子程序內返回。子程序永遠返回0,而父程序返回子程序的ID。子程序只需要呼叫getppid()就可以拿到父程序的ID
四、multiprocessing
multiprocessing是跨平臺版本的多程序模組,它提供了一個Process類來代表一個程序物件
五、程序間通訊Queue
Queue是多程序安全的佇列,可以使用Queue實現多程序之間的數據傳遞