1. 程式人生 > >網絡編程2

網絡編程2

15161

管道

在內存中開辟一個管道空間,對多個進程可見。在通信形式上形成一種約束。

linux 文件類型
b c d - l s p
目錄 普通文件 鏈接 套接字 管道

multiprocessing ---》 Pipe 函數

Pipe(duplex)
功能 : 創建一個管道
參數 : duplex 默認為 True 表示管道為雙向管道
如果設置為False 則表示管道為單向管道

返回值 : 返回兩個管道流對象,分別表示管道的兩端

            如果參數為True(默認) 兩個對象均可發送接受
            如果為False時 則第一個對象只能接受,第二個對象只能發送
  • 向管道發送數據使用send()函數,從管道接受數據使用recv()函數
  • recv()函數為阻塞函數,當管道中數據為空的時候會阻塞
  • 一次recv() 只能接受一次send()的內容
  • send()可以發送字符串數字列表等多種類型數據

消息隊列

multiprocessing --- > Queue

在內存中開辟一個隊列模型,用來存放消息。任何擁有隊列對象的進程都可以進行消息的存放和取出

Queue(maxsize = 0)
功能 : 創建一個消息隊列對象
參數 : maxsize 默認為0 表示消息隊列可以存放的消息有 系統自動分配的空間而定

0 正整數 表示隊列中最多存放多少條消息

返回值 : 消息隊列對象

q.put()
向消息隊列中存放一條消息,當消息隊列滿的時候,會阻塞
存放的消息類型可以使數字列表,字串等

q.full()
判斷隊列是否為滿,如果滿則返回True 否則返回False

q.qsize()
查看當前隊列中消息數量

q.get()
獲取消息,每次獲取一條,當消息隊列為空是,則阻塞

q.empty()
消息隊列為空則返回True 不為空返回False

  • put get 中block參數和timeout參數
    block 默認為True 表示兩個函數都是阻塞函數
    如果設置為False則表示不阻塞

timeout 當block設置為True的時候表示超時等待時間

共享內存

在內存中開辟一段內存空間存儲數據,每次存儲的內容會覆蓋上次的內容。由於沒有對內存進行格式化的修飾所以存取速度塊效率高

from multiprocessing import Value,Array

obj = Value(ctype,obj)
功能 : 開辟共享內存
參數 : ctype 要轉變的c的類型
obj 要寫入共享內存的初始值

obj.value 屬性為獲取共享內存中的值

obj = Array(ctype,obj)
功能 : 開辟一個共享內存空間
參數 : 要轉換的c的類型
obj : 放入共享內存中的數據,是一個列表,要求列 表中的數據為相同類型數據

                         如果obj傳入一個正數,則表示在共享內存中開辟一個 多大的空間,空間中可以存放的數值類型 由ctype確定

返回值:返回一個可叠代對象通過for循環取值,可以進行修改

       管道         消息隊列         共享內存 

開辟空間 內存中 內存中 內存中

讀寫方式 可雙向/單項 先進顯出 操作內存
按照個數存儲
效率 一般 一般 較快

是否需要 不需要 不需要 需要
同步互斥

信號 :

kill -l 查看系統信號
kill -signame PID 給進程號PID的進程發送signame信號

信號 : 信號名稱 含義 默認處理方法

名稱 : 系統定義
含義 : 系統定義
處理方式 : 采用默認方式處理 (系統定義 終止 暫停 忽略
忽略信號(當信號沒發生過)
采用自定義的方式處理

如何發送信號:
os.kill(pid,sig)
功能 : 向一個進程發送一個信號
參數 : pid :要發送進程的PID號
sig :要發送的信號

signal.alarm(sec)
功能:給自己發送一個時鐘信號 (SIGALRM)
參數: sec : 秒數 表示在相應的秒數後發送時鐘信號

  • 信號是一種異步的進程間通信方式
  • alarm 函數在一個進程中如果使用多次,則後面的時鐘時間會覆蓋前面的時間

信號的處理:

signal.pause()
阻塞等待一個信號的發生

signal.signal(signum,handler)
功能 : 處理信號
參數 : signum : 表示可以處理的信號
handler : 信號的處理方法

                默認處理方式 : SIG_DFL
             忽略信號     : SIG_IGN
                                 自定義的方式 : function
  • signal函數也是一個異步處理信號函數
  • SIGSTOP 和 SIGKILL不能被signal函數處理

僵屍進程的信號處理方案 父進程中
signal(SIGCHLD,SIG_IGN)

同步和互斥

臨界資源 : 對多個進程或者線程都可見的資源,容易產生爭奪,我們將這類資源稱為臨界資源

臨界區 : 對臨界資源進行操作的代碼區域稱之為臨界區

解決資源爭奪: 同步 或者 互斥

同步 : 同步是一種合作關系,為完成某種任務而建立的多個進程或者線程之間的協調調用,次序等待,傳遞消息告知資源占用情況

互斥 : 互斥是一種制約關系,當一個進程或者線程進入到臨界區後會進行枷鎖操作,此時其他進程(線程)無法進如臨界區,只有當該進程(線程)使用後進行解鎖,其他人才可以使用。這種技術往往是通過阻塞完成

網絡編程2