二十九、python多執行緒、多程序、協程中涉及的知識點
阿新 • • 發佈:2020-07-24
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
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、佇列
-
先進先出
-
LifoQueue
後進先出
-
PriorityQueue
可以給放入佇列中的資料設定優先順序
""" 它的出現是為了保證計算機硬體的安全 降低了程式的執行效率,但是保證了計算機硬體安全""" 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、總結
多程序下面開設多執行緒
多執行緒下面再開設協程
從而使程式執行效率提升