python學習筆記-Day10--(select-IO多路複用)(queue)

IO 分磁盤IO和網絡IO,這裏的IO指的是網絡IO.

計算機在傳輸數據的時候 採用的是流傳輸,如果從系統層看對於一臺只有一個網卡的計算機網絡IO只有一個.

前面我們在用到socket的時候 用到的send和recv就是在一條IO通道里傳輸數據的.(先不要考慮多進程和多線程)

通常這種操作是無法完全利用IO的,也就是說 我們沒有完全有限的把資源利用起來,就好像

A和B兩個地點,兩者之間有一條路,在一個時間段內 只有一輛車在行走,

此時IO多路複用就出現了.即 通過一種機制監視多個描述符,一旦某個描述符有變化,就通知相應的程序進行處理.

IO多路複用機制常見的有select poll epoll,還有一個kqueue

三者的區別:

select

  1. 幾乎支持所有的平臺,

  2. 單個進程監視的文件描述符有數量限制,

  3. 維護大量的文件描述符組成的數據結構的時候,文件描述符越多,複製的開銷就越大

  4. 在掃描的時候使用線性掃描,

  5. 需要不斷輪詢自己的文件描述符集合,知道設備就緒


poll -- 本質與select無區別

  1. 沒有最大連接數限制


epoll  -- linux2.6之後出現,是對select和poll的改進

  1. epoll 在把文件描述符從用戶態複製到內核態時,只需要一次

  2. 沒有最大文件描述符數量限制,

  3. epoll爲每個文件描述符指定一個回調函數,設備就緒後在等待隊列上的等待者的時候就會調用這個函數 (這裏的等待列隊是epoll內部定義的等待隊列)




python中有一個select模塊.提供了select\poll\epoll三種方法,分別調用系統中的select\poll\epoll來實現IO多路複用


注意:

在win 和 mac 下 都只支持select

在linux下 select\poll\epoll三種 都支持


select()的參數是三個列表 (必填)

select.select(rlist,wlist,xlist,timeout=None)

rlist: 序列中的句柄發生可讀時(accetp和read),則獲取發生變化的句柄並添加到 返回值1 序列中

wlist: 序列中含有句柄時,則將該序列中所有的句柄添加到 返回值2 序列中

xlist:序列中的句柄發生錯誤時,則將該發生錯誤的句柄添加到 返回值3 序列中


import select
import threading
import sys

while True:
    readable, writeable, error = select.select([sys.stdin,],[],[],1)
    if sys.stdin in readable:
        print 'select get stdin',sys.stdin.readline()


Queue模塊

import Queue
mq = Queue.Queue(maxsize=10)


Queue.Queue類 是隊列的一個實現,可指定或者不指定隊列長度,maxsize爲可選參數,用來設置隊列的長度.

常用的方法

put(item, block=True, timeout=None)

    向隊列中添加一個元素,如果隊列已滿 則等待.

    item參數爲必填項,爲插入的值,

    block爲可選參數,默認爲True

    timeout爲可選參數,默認爲None

get(block=True,timeout=None)

    刪除並返回隊列中的一個元素,如果隊列爲空,則等待,


mq.put_nowait()
mq.()

用法同上,但是不等待.

其他用法

qsize() 返回隊列的大小 

empty() 如果隊列爲空,返回True,反之False 
full() 如果隊列滿了,返回True,反之False
task_done() 在完成一項工作之後,Queue.task_done()函數向任務已經完成的隊列發送一個信號
join() 實際上意味着等到隊列爲空,再執行別的操作


參考:

http://www.cnblogs.com/alex3714/p/4372426.html

http://www.cnblogs.com/Anker/p/3265058.html

http://www.cnblogs.com/wupeiqi/articles/5040823.html


個人Blog

www.timesnotes.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章