IO 分磁盤IO和網絡IO,這裏的IO指的是網絡IO.
計算機在傳輸數據的時候 採用的是流傳輸,如果從系統層看對於一臺只有一個網卡的計算機網絡IO只有一個.
前面我們在用到socket的時候 用到的send和recv就是在一條IO通道里傳輸數據的.(先不要考慮多進程和多線程)
通常這種操作是無法完全利用IO的,也就是說 我們沒有完全有限的把資源利用起來,就好像
A和B兩個地點,兩者之間有一條路,在一個時間段內 只有一輛車在行走,
此時IO多路複用就出現了.即 通過一種機制監視多個描述符,一旦某個描述符有變化,就通知相應的程序進行處理.
IO多路複用機制常見的有select poll epoll,還有一個kqueue
三者的區別:
select
幾乎支持所有的平臺,
單個進程監視的文件描述符有數量限制,
維護大量的文件描述符組成的數據結構的時候,文件描述符越多,複製的開銷就越大
在掃描的時候使用線性掃描,
需要不斷輪詢自己的文件描述符集合,知道設備就緒
poll -- 本質與select無區別
沒有最大連接數限制
epoll -- linux2.6之後出現,是對select和poll的改進
epoll 在把文件描述符從用戶態複製到內核態時,只需要一次
沒有最大文件描述符數量限制,
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