1. 程式人生 > >puthon中同步與互斥知識

puthon中同步與互斥知識

重點:多執行緒建立,多執行緒當中同步和互斥,生產者消費者模式。。***互斥鎖***。local--理解為主

==================================== 互斥鎖鎖的建立: 為了解決執行緒間競爭訪問全域性資源的問題。
  1. 格式:mutex = theading.lock() :建立互斥鎖鎖
  2. 執行緒先進行t = threading.Thread(target = func)功能函式
  3. 在func函式中,建立鎖mutex.acquire()---進行所得申請,如果申請到,向下執行--阻塞方式進行
  4. mutex.release()釋放鎖
  5. flag =mutex.acquire(flase)---非阻塞方式申請#如果沒申請到值,執行緒不等待,返回flase,如果申請到鎖,返回值是true。返回的是布林型別的值。
  6. 加鎖和解鎖的時間,在訪問全域性變數之前申請鎖,在操作完全域性變數值和解鎖。 
  7. 互斥鎖的缺點,程式時間變長,降低效率。
  死鎖:
  1. 多執行緒\程序操作,各個執行緒\程序在相互等待對方鎖的資源,造成的狀態叫做死鎖。
  2. split vertically 分屏 pycharm 
  3. 解決死鎖的方法,新增一個超時。如果其它鎖未全部獲得,則釋放該鎖。
  4. mutex.acquire(timeout = 3)等待3秒,沒有獲得直接釋放。
  5. 互斥:要求一次一個操作,同步:要求一次一個按順序操作。
同步:一次一個按順序進行
  1. 鎖的同步比較少見,鎖的同步需要佇列的傳入。
  2. 生產者消費者佇列: *當生產者能力大於消費者能力,倉庫滿時,生產者進入等待。*當消費者能力大於生產者能力,當倉庫為空時,消費者進入等待。引入queue 
  3. 耦合性指的是模組之間相互聯絡的程度。
  4. 執行緒當中的區域性變數是各自私有的。執行緒類當中的區域性變數也是各自私有的。
  5. ThreadLocal---建立全域性的ThreadLocal物件。* bag = threading.local()建立全域性物件。*bag,name = name對ThreadLocal()物件繫結name屬性。*在沒有傳參的函式裡讓 a = gba.name。
  6. GIL ---全域性直譯器鎖。。是cpython直譯器設計留下的歷史問題。任何執行緒在執行之前必須獲取這個全域性鎖才能執行,每當執行完100條位元組碼,全域性直譯器鎖會釋放,切換到其他執行緒執行。有GIL意味著python在多核cpu當中是不能充分利用核數進行工作的。
  7. 多程序能夠充分利用多核。