孤兒程序,殭屍程序,multiprocessing 模組建立程序
程序相關函式使用
os.getpid()
功能 : 獲取當前程序的PID號
返回值 : 返回PID號
os.getppid()
功能 : 獲取父程序的程序號
返回值 : 返回PID號
os._exit(status)
功能 : 退出程序
引數 : 程序的退出狀態 整數
sys.exit([status])
功能: 退出程序
引數: 預設為0 如果是整數則表示退出狀態
如果是字串則表示退出時列印內容
* sys.exit 可以通過捕獲SystemExit異常阻止退出
孤兒程序 : 父程序先於子程序退出,此時子程序就會成為孤兒程序。
* 孤兒程序會被系統指定的程序收養,即系統程序會成為該孤兒程序新的父程序。孤兒程序退出時該父程序會處理退出狀態
殭屍程序 : 子程序先於父程序退出,父程序沒有處理子程序退出狀態,此時子程序成為殭屍程序
* 殭屍程序已經結束,但是會滯留部分PCB資訊在記憶體,大量的殭屍會消耗系統資源,應該儘量避免
如何避免殭屍程序產生
* 父程序處理子程序退出狀態
pid,status = os.wait()
功能 :在父程序中阻塞等待處理子程序的退出
返回值 : pid 退出的子程序的PID號
status 子程序的退出狀態
pid,status = os.waitpid(pid,option)
功能 : 同wait
引數 : pid -1 表示任意子程序退出
>0 整數 指定PID號的子程序退出
option 0 表示阻塞等待
WNOHANG 表示非阻塞
返回值 : 同wait
waitpid(-1,0) ====== wait()
* 父程序先退出
建立二級子程序
1. 父程序建立子程序等待子程序退出
2. 子程序建立二級子程序,然後馬上退出
3. 二級子程序成為孤兒,處理具體事件
寫一個聊天室
功能 : 類似qq群聊
1. 進入聊天室需要輸入使用者名稱
2. 有人進入聊天室 其他人會收到提示
xxx 進入聊天室
3. 某人發訊息,則其他人都能收到
xxx 說: xxxxxxxxx
4. 有人退出聊天室 其他人會收到提示
xxx 退出了聊天室
5. 管理員功能,管理員喊話聊天室所有人都能收到
服務端 客戶端
* 整體實現方案
* 用什麼技術
1. 用什麼技術
socket通訊 ----> 訊息轉發 ----》 UDP通訊
轉發模式 ---> 每個將訊息傳送給伺服器,伺服器發 送個每個成員
訊息收發 ---> 使用多程序讓傳送和接受互不影響
儲存使用者 ---> 字典 或者 列表
姓名,地址
注意 : 使用一定的封裝性
測試 , 每個功能進行測試
程式碼編寫
先搭建網路連線 --》 多程序建立 --》每個功能編寫--
》功能測試
客戶端
* 登入 "L name"
伺服器 : 識別請求 判斷是否可以登入
保留使用者
將登入訊息通知其他人
* 聊天 "C name message"
伺服器 : 識別請求
將訊息轉發給其他人
* 退出 "Q name"
伺服器 : 識別請求
告知其他人退出
從結構中刪除使用者
伺服器
multiprocessing 模組建立程序
1. 需要將要做的事件封裝為函式
2. 使用multiprocessing中提供的Process類建立程序物件
3.通過程序物件和Process 初始化函式 對程序進行設定,並且繫結要執行的事件
4. 啟動程序,會自動執行相關聯函式
5. 事件完成後回收程序
建立程序物件
Process()
功能 : 建立程序物件
引數 : name : 給建立的程序起一個名字
預設Process-1
target : 繫結的函式
args : 元組 給target函式按照位置傳參
kwargs : 字典 給target函式按照鍵值出傳參
p.start()
功能: 啟動程序,此時程序被建立。自動執行程序函式
p.join([timeout])
功能 : 阻塞等待回收響應的程序
引數 : 超時時間
* multiprocessing建立程序是原來程序的子程序,建立後父子程序各自執行互不影響
* 子程序同樣是複製父程序的空間,子程序對內容的修改不會影響父程序空間
* join回收子程序,會有效的阻止殭屍程序產生