1. 程式人生 > >python學習筆記(13):python併發程式設計以及系統常用模組

python學習筆記(13):python併發程式設計以及系統常用模組

一、程序與執行緒

  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 for
i 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實現多程序之間的數據傳遞