1. 程式人生 > >併發程式設計知識點彙總

併發程式設計知識點彙總

所謂併發就是有多個程序 在同一時刻執行同一段程式碼
子程序中不能有input,因為主程序與子程序是兩個單獨的程序

多程序實現併發效果
開啟多程序有兩種方法
人為和記憶體打交道或者硬碟和記憶體打交道,不涉及到cpu計算的就是一個IO,
例如input或者從硬碟讀取檔案都是一個IO

作業系統的作用:
(1)隱藏硬體介面,提供良好的抽象介面
(2)管理、排程程序,將多個程序對硬體的競爭變的有序
執行中的程式就是程序
程式是一個沒有生命的實體,只有執行它的時候才會成為一個活動的實體,我們稱之為程序

join():確保上面程序執行完畢再執行下面的程式碼,也就是使非同步變為同步
多個程序之間的資料是完全隔離的,就算父程序與子程序之間的資料也是完全隔離的




同步:
非同步:
單程序:
多程序:
阻塞:
非阻塞:

多程序中子程序常用屬性和方法:
start():開始一個子程序
join():感知一個子程序的結束
terminate():結束一個程序
is_alive():檢查一個程序是否結束
name:檢視程序名
daemon:為True的時候,表示新的子程序是一個守護程序
守護程序:在start之前設定daemon為True
隨著主程序的程式碼執行完畢而結束,這個子程序稱之為守護程序,而不是隨著主程序的結束而結束

△:當terminate一個程序時如果立即is_alive程序會顯示為True,
因為結束一個程序是向作業系統傳送一個結束請求,系統不會立即反應過來,需要一個作業系統響應的過程


程序鎖: from multiprocessing import Lock
lock = Lock()
需要加鎖的程式碼前面:lock.acquire() #拿鑰匙
需要加鎖的程式碼前面:lock.release() #還鑰匙
涉及到修改資料的程式碼操作都需要加鎖

訊號量: from multiprocessing import Semaphore
用途用法和程序鎖一樣,程序鎖是控制一個程序工作,訊號量是控制多個程序工作

事件:
from multiprocessing import Event
e = Event() #建立一個事件

print(e.is_set()) # 檢視這個事件的阻塞狀態,預設False
e.set() # 將這個事件的阻塞狀態改為True
print(e.is_set())
e.wait() # 根據is_set()的值決定是否阻塞 True為不阻塞,False為阻塞
e.clear() # 將這個事件的阻塞狀態改為False
print(e.is_set())

佇列:
from multiprocessing import Queue
q = Queue(3)#建立佇列,引數為可放入的數量
q.put(1)#放入資料
q.put(2)
q.put(3)
print(q.get())#取資料,如果為空就阻塞
print(q.full())#檢視佇列是否滿了
print(q.get())#取檢視佇列是否有空位
try:
print(q.get_nowait())#取資料,如果為空不阻塞,所以可用捕捉異常,另行處理
except:
print("沒值了")