1. 程式人生 > >pythonNet 04多工程式設計程序

pythonNet 04多工程式設計程序

poll的多路複用
p =select.poll()
功能:建立poll物件
返回值:poll物件

p.register(fd,event)
功能:註冊要關注的IO事件
引數: fd 要關注的IO物件
        event 選擇要關注的事件
            常用時間型別: POLLIN 讀IO事件 rlist
                           POLLOUT 寫IO事件 wlist


                           POLLERR 出錯IO   xlist
                           POLLHUP 連線斷開事件

   e.g  p.register(sockfd,POLLIN |POLLERR)

p.unregister(fd)
功能:取消對IO的關注
引數:IO物件或檔案描述符

event =p.poll
功能:阻塞等待監控的IO事件發生
返回值:返回一個列表,event 是一個列表,格式如下:
        [(fileno,event),()...]
        其中每個元組為一個就緒的IO事件
        元組中有該IO的fileno和就緒的事件型別

*需要字典配合通過fileno查詢對應的IO事件物件
{fileno:io_boj}    e.g. {sockfd.fileno():sockfd}

poll_server步驟
1.建立套接字
2.將套接字設定為關注
3.建立查詢字典,並維護
4.迴圈監控IO發生
5.處理髮生的IO事件

epoll方法實現IO多路複用

使用方法: 基本與poll方法相同
*生成物件改為epoll()方法
*事件型別改為EPOLL型別

epoll特點

*epoll效率比select和poll要高
*epoll的IO監控數量比select要多
*觸發方式多(邊緣觸發)

傳送更豐富的資料結構

struct模組 結構化資料
原理; 將資料轉化為bytes格式,並且可以將bytes格式資料轉換回來

Struct(fmt)
功能;生成struct物件
引數:fmt 定製的資料結構組成

        e.g.
            要發的資料: 1b'zhang'1.75
            組織的型別格式:Struct('i5sf')

        python型別   fmt
        int           i
        float         f
        bytes         ns(n代表幾個字元)
返回:struct物件

st.pack(v1,v2,v3...)
功能:將資料按照制定格式打包轉換為bytes
引數;要傳送的資料
返回:打包後的bytes字串

    e.g.    st.pack(1,b'zhang',1.75)
st.unpack(bytes_data)
功能;將bytes字串解析為制定個數資料
引數;要解析的bytes字串
返回;元組,為解析後的內容

*struct模組可以直接呼叫pack() unpack()
此時兩個函式第一個引數為fmt
e.g.
struct.pack('i5sf',1,b'zhang',1.75)


本地套接字

功能: 本地兩程式之間傳送資料訊息
建立流程:
    1.建立本地套接字
     sockfd =socket(AF_UNIX,SOCK_STREAM)
    2.繫結本地套接字檔案
    sockffd.bind(path)
    3.監聽
    sockfd.listen()
    4.訊息收發
    send,recv

多工程式設計

意義;充分利用計算機資源提高程式的執行效率

定義:通過一定的程式設計手段,在一個程式執行中可以同時利用計算機執行多個任務,以此提高程式執行效率
實現方案;多程序   多執行緒
併發:同時處理多個任務,核心在人物間不斷地切換達到好像多個任務均被同等執行的效果,實際每個時刻只有一個任務
    佔用核心

並行:多個任務利用計算機多核資源在同時執行,此時多個任務間為並行關係


程序(process)
定義:程式在計算機中的一次執行過程

程式:是一個可執行檔案,是靜態的佔有磁碟空間
程序:程序是一個動態的過程,佔有計算機資源,有一定生命週期

程序誕生
1.使用者空間通過呼叫程式介面或者命令發起程序建立請求
2.作業系統接受使用者請求,開始建立程序
3.作業系統分配計算機資源,確定程序狀態,開闢空間等
4.作業系統將穿件的程序提供給使用者使用


一些概念

cpu時間片:如果一個程序佔有cpu核心則稱這個程序在cpu時間片上

PCB(程序控制塊):在記憶體中開闢的一塊空間存放程序的基本資訊

程序ID(PID):系統為程序分配的ID號,每個程序不重複
    命令:ps -aux

父子程序:系統中每一個程序都唯一的父程序,可以有多個或0個子程序,這樣形成父子程序關係

    檢視程序樹 pstree

程序狀態

    三態;就緒態:程序具備執行條件,等待系統分配cpu資源,
          執行態:程序佔有cpu時間片正在執行
          等待態:程序暫時阻塞不具備執行條件


    五態:(增加新建態,和終止態)
        新建態:建立一個新的程序,獲取系統資源
        終止態:程序結束,釋放系統資源的過程
       
       檢視命令:ps -aux --> STAT列
            S 等待態(短暫等)
            D等待態(一直等)
            T等待態
            R執行態
            Z殭屍程序

程序優先順序
    作用:決定程序的優先許可權和佔有資源的優先程度

    檢視命令:top 動態檢視程序優先順序

    linux優先順序範圍: -20 --19 數字越小優先順序越高

    指定優先順序執行程式:
    nice -9 python3 while.py 以9的優先順序執行
    nice --9 python3 while.py 以-9的優先順序執行

    <   有較高的優先順序
    N   有較低的優先順序
    +   前臺程序
    S   會話組組長
    l   有連結子程序的

 

程序的特徵
   
    1.程序可以使用計算機的多核資源
    2.程序是計算機分配資源的最小單位
    3.程序之間互不影響,各自獨立執行
    4.每個程序的空間獨立,各佔有自己的空間資源
 
要求;
    1.什麼是程序,程序和程式的區別
    2.程序特徵有哪些
    3.程序都有哪些狀態,各種狀態如何轉換

 

多程序程式設計
import os
pid =os.fork()
功能:建立新的程序
引數:無
返回值:失敗返回一個負數,
        成功:在原程序中返回新程序的pid號
                在新程序中返回0

注意:
    *子程序會複製父程序的全部程式碼段和記憶體空間
    *子程序會fork的下一句開始執行
    *if elif else 結構判斷fork返回值的不同從而使父子程序執行不同的程式碼幾乎是固定的搭配
    *父子程序各自獨立執行,執行順序不一定
    *子程序有自己特有的內容比如PID 程序控制塊 命令集