1. 程式人生 > 實用技巧 >二十九、python多執行緒、多程序、協程中涉及的知識點

二十九、python多執行緒、多程序、協程中涉及的知識點

1、GIL全域性直譯器鎖

  https://www.cnblogs.com/nuochengze/p/12664602.html

  1、GIL是CPython直譯器的特點, 在其它直譯器中不存在

  2、GIL本質是一把互斥鎖,但它是直譯器級別的鎖

  3、它的存在是因為CPython直譯器記憶體管理不是執行緒安全的

    記憶體管理,即垃圾回收機制,包括

      引用計數

      標記清除

      分代回收

  4、GIL的存在導致了用一個程序下的多個執行緒無法利用多核優勢

  5、針對不同的資料應該加不同的鎖來保證安裝

2、互斥鎖、死鎖與遞迴鎖

  https://www.cnblogs.com/nuochengze/p/12640152.html

中1.4同步

3、訊號量

  • 訊號量在不同的階段可能對應不同的技術點

  • 在併發程式設計中訊號量指的是

from threading import Semaphore, Thread
import time
import random

sm = Semaphore(5)


def task(name):
    sm.acquire()
    print("%s 正在執行" % name)
    time.sleep(random.randint(1, 5))
    sm.release()


if __name__ == "__main__":
    for i in range(20):
        t 
= Thread(target=task, args=('%s 號' % i,)) t.start()

4、Event

# 一些執行緒/程序等待另外一些執行緒/程序傳送可以執行的訊號, 才開始執行

from theading import Event
e = Event()
# 等待
e.wait()
# 傳送訊號
e.set()

5、佇列

  • Queue

    先進先出

  • LifoQueue

    後進先出

  • PriorityQueue

    可以給放入佇列中的資料設定優先順序

    數字越小,優先順序越高

6、池

"""
它的出現是為了保證計算機硬體的安全
降低了程式的執行效率,但是保證了計算機硬體安全
""" from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import time pool = ThreadPoolExecutor(5) # 池子裡面固定只有五個執行緒 """ 括號內可以傳數字,不傳的話預設會開設當前計算機CPU個數五倍的執行緒 池子造出來之後,裡面會固定存在五個執行緒,這5個執行緒不會重複建立和銷燬 """ """ 將任務提交給池子,就能使用 """ def task(n): print(n) return n * n """ 任務的提交方式: 同步:提交任務之後原地等待任務的返回結果,期間不做任何事情 非同步:提交任務之後不等待任務的返回結果,繼續往下執行 """ def task_call(n): print(">>>> %s" % n.result()) for i in range(20): pool.submit(task, i).add_done_callback(task_call) # submit非同步提交 # submit其實會返回一個Future類的物件,該物件呼叫result就能獲取到任務的結果 # 池子物件的方法 # pool.shutdown() # 關閉池子,等待池子中所有的任務執行結束,再繼續往後執行程式碼 # 非同步回撥機制 # 給每一個非同步提交的任務繫結一個方法,一旦任務有結果了會立即自動觸發該方法

7、總結

  多程序下面開設多執行緒
  多執行緒下面再開設協程
  從而使程式執行效率提升