天天看點

pythonweb-fork以及僵屍程序

  1. poll 方法實作IO多路複用

    p = poll()

    p.register()

    p.unregister()

    p.poll()

  2. epoll方法實作IO多路複用
    • 效率更高
    • 觸發方式更多
    • 監控IO數量更多
  3. struct子產品使用

    功能 : 将python資料轉換為位元組串,将位元組串解析為python資料

    Struct(fmt) 生成資料的結構對象

    pack() 将資料打包為bytes

    unpack() 将資料解析

  4. 本地套接字

    作用 : 用于兩個本地程序間通信

  5. 多任務程式設計

    什麼是多任務程式設計?

    什麼是并行,什麼是并發

  6. 程序

    什麼是程序?

    程序概念

  7. 基于fork的多程序并發

一. 基于fork的多程序程式設計(續)

  1. fork的運作特征
* 子程序會複制父程序的全部記憶體空間,從fork的下一句開始執行
* 父子程序各自獨立運作,執行順序不确定
* 通常情況下fork與if結構是固定搭配,利用父子程序中fork的傳回值差異使其各自執行不同的内容
* 父程序在fork之前開辟的記憶體空間子程序同樣會擁有,父子程序各自對各自空間的操作互不影響
* 父子程序有各自的特征,比如PID PCB 指令集。
           

二. 程序相關函數

  1. os.getpid()

    功能 : 擷取目前程序的PID号

    傳回值: 傳回PID

  2. os.getppid()

    功能: 擷取父程序的PID号

    傳回: 傳回PID

  3. os._exit(status)

    功能: 結束一個程序

    參數: 程序的退出狀态 整數

  4. sys.exit([status])

    功能: 結束一個程序

    參數: 整數表示程序退出狀态 預設為0

    字元串則表示程序退出時列印内容

三. 孤兒和僵屍

  1. 孤兒程序 :父程序先于子程序退出,此時子程序成為孤兒程序
特點: 孤兒程序會被系統程序收養,此時系統程序就會成為孤兒程序新的父程序。
           
  1. 僵屍程序 :子程序先于父程序退出,父程序又沒有處理子程序的退出狀态,此時子程序就會成為僵屍程序。
特點: 僵屍程序雖然已經結束,但是會存留部分資訊在PCB中,大量的僵屍程序會浪費系統記憶體資源。
           
  1. 如何避免僵屍程序

    【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. 父程序建立子程序,等待回收
               
    1. 子程序建立二級子程序後立即退出
    2. 二級子程序成為孤兒,和原父程序一同執行事件

    【3】 通過信号處理子程序退出

    原理 :子程序退出時會由作業系統給父程序發送信号,如果父程序忽略這個信号則子程序的退出由作業系統自動處理。

方法 :使用signal子產品忽略信号
  
    import  signal
    signal.signal(signal.SIGCHLD,signal.SIG_IGN)
     
 * 在父程序中添加如上語句,則該父程序所有的子程序退出均由作業系統處理
           

四. 群聊聊天室

  1. 功能 : 類似qq群聊功能

    【1】 有人進入聊天室需要輸入姓名,姓名不能重複

    【2】 有人進入聊天室,其他人會收到通知

    xxx 進入了聊天室
               
    【3】 一個人發消息,其他人會收到消息
    xxx :xxxxxxx
               
    【4】 有人退出聊天室,其他人也會收到通知
    xxx 退出了聊天室
               
    【5】 擴充功能 : 服務端消息公告,服務端發送消息所有人都能收到
    管理者消息:xxxxxxxxx
               
  2. 确定技術模型

    【1】 服務端和用戶端,服務端處理請求,發送管理者消息

    用戶端執行各種功能

    【2】 套接字選擇 : UDP套接字

    【3】 消息發送模型 : 轉發

    用戶端 --》 服務端 --》其他用戶端

    【4】 存儲使用者資訊 {name:addr}

    【5】 處理收發關系 : 多程序分别處理收發

  3. 注意事項

    【1】 設計封裝方案

    【2】 寫一個功能子產品測試一個子產品

    【3】 注意注釋的添加

  4. 具體實作流程

    【1】 搭建網絡模型

    【2】 進入聊天室

    1. 用戶端 : * 輸入姓名
      • 發送給伺服器
      • 接收伺服器回報
      • 不允許則重新輸入,允許則進入聊天室
      • 建立新的程序用于消息收發
    2. 服務端 : * 接收姓名

      * 判斷是否允許進入

      • 将結果回報給用戶端
      • 如果不允許則結束,允許将使用者插入資料結構
      • 給其他人發送通知
    【3】 聊天
    1. 用戶端 : * 循環發送消息

      * 循環接收消息

    2. 服務端: * 接收消息,判斷消息類型

      * 将消息轉發

    【4】 退出聊天室

    【5】 管理者消息

作業 : 1. 将現有聊天室代碼整體

2. 嘗試自己完成剩餘功能

3. fork程序整理,能夠掌握運作原理

4. 類的設計