-
poll 方法實作IO多路複用
p = poll()
p.register()
p.unregister()
p.poll()
- epoll方法實作IO多路複用
- 效率更高
- 觸發方式更多
- 監控IO數量更多
-
struct子產品使用
功能 : 将python資料轉換為位元組串,将位元組串解析為python資料
Struct(fmt) 生成資料的結構對象
pack() 将資料打包為bytes
unpack() 将資料解析
-
本地套接字
作用 : 用于兩個本地程序間通信
-
多任務程式設計
什麼是多任務程式設計?
什麼是并行,什麼是并發
-
程序
什麼是程序?
程序概念
- 基于fork的多程序并發
一. 基于fork的多程序程式設計(續)
- fork的運作特征
* 子程序會複制父程序的全部記憶體空間,從fork的下一句開始執行
* 父子程序各自獨立運作,執行順序不确定
* 通常情況下fork與if結構是固定搭配,利用父子程序中fork的傳回值差異使其各自執行不同的内容
* 父程序在fork之前開辟的記憶體空間子程序同樣會擁有,父子程序各自對各自空間的操作互不影響
* 父子程序有各自的特征,比如PID PCB 指令集。
二. 程序相關函數
-
os.getpid()
功能 : 擷取目前程序的PID号
傳回值: 傳回PID
-
os.getppid()
功能: 擷取父程序的PID号
傳回: 傳回PID
-
os._exit(status)
功能: 結束一個程序
參數: 程序的退出狀态 整數
-
sys.exit([status])
功能: 結束一個程序
參數: 整數表示程序退出狀态 預設為0
字元串則表示程序退出時列印内容
三. 孤兒和僵屍
- 孤兒程序 :父程序先于子程序退出,此時子程序成為孤兒程序
特點: 孤兒程序會被系統程序收養,此時系統程序就會成為孤兒程序新的父程序。
- 僵屍程序 :子程序先于父程序退出,父程序又沒有處理子程序的退出狀态,此時子程序就會成為僵屍程序。
特點: 僵屍程序雖然已經結束,但是會存留部分資訊在PCB中,大量的僵屍程序會浪費系統記憶體資源。
-
如何避免僵屍程序
【1】 使用wait函數處理子程序退出狀态
pid,status = os.wait()
功能:父程序中阻塞等待處理子程序的退出
傳回值:pid 退出的子程序的PID号
status 子程序退出狀态
pid,status = os.waitpid(pid,option)
功能:父程序中等待處理子程序的退出
參數:pid -1 表示等待任意子程序退出
>0 表示等待指定的子程序退出
option 0 表示阻塞等待
WNOHANG 表示非阻塞
傳回值:pid 退出的子程序的PID号
status 子程序退出狀态
【2】 建立二級子程序處理僵屍
1. 父程序建立子程序,等待回收
- 子程序建立二級子程序後立即退出
- 二級子程序成為孤兒,和原父程序一同執行事件
【3】 通過信号處理子程序退出
原理 :子程序退出時會由作業系統給父程序發送信号,如果父程序忽略這個信号則子程序的退出由作業系統自動處理。
方法 :使用signal子產品忽略信号
import signal
signal.signal(signal.SIGCHLD,signal.SIG_IGN)
* 在父程序中添加如上語句,則該父程序所有的子程序退出均由作業系統處理
四. 群聊聊天室
-
功能 : 類似qq群聊功能
【1】 有人進入聊天室需要輸入姓名,姓名不能重複
【2】 有人進入聊天室,其他人會收到通知
【3】 一個人發消息,其他人會收到消息xxx 進入了聊天室
【4】 有人退出聊天室,其他人也會收到通知xxx :xxxxxxx
【5】 擴充功能 : 服務端消息公告,服務端發送消息所有人都能收到xxx 退出了聊天室
管理者消息:xxxxxxxxx
-
确定技術模型
【1】 服務端和用戶端,服務端處理請求,發送管理者消息
用戶端執行各種功能
【2】 套接字選擇 : UDP套接字
【3】 消息發送模型 : 轉發
用戶端 --》 服務端 --》其他用戶端
【4】 存儲使用者資訊 {name:addr}
【5】 處理收發關系 : 多程序分别處理收發
-
注意事項
【1】 設計封裝方案
【2】 寫一個功能子產品測試一個子產品
【3】 注意注釋的添加
-
具體實作流程
【1】 搭建網絡模型
【2】 進入聊天室
- 用戶端 : * 輸入姓名
- 發送給伺服器
- 接收伺服器回報
- 不允許則重新輸入,允許則進入聊天室
- 建立新的程序用于消息收發
-
服務端 : * 接收姓名
* 判斷是否允許進入
- 将結果回報給用戶端
- 如果不允許則結束,允許将使用者插入資料結構
- 給其他人發送通知
-
用戶端 : * 循環發送消息
* 循環接收消息
-
服務端: * 接收消息,判斷消息類型
* 将消息轉發
【4】 退出聊天室
【5】 管理者消息
- 用戶端 : * 輸入姓名
作業 : 1. 将現有聊天室代碼整體
2. 嘗試自己完成剩餘功能
3. fork程序整理,能夠掌握運作原理
4. 類的設計