這個東西以前剛接觸,有很多理解不是很清楚。對於模型和不同模型的對比,unix網路編程 有詳細的解釋
因為python是簡單調用unix系統的函數,所以找了unix網路編程參看了下,還是比較模糊
select 是屬於同步I/O操作,屬於I/O複用模型的一種。
這個函數允許進程指示核心等待多個事件中的任一個發生,並僅在一個或多個事件發生或經過某指定的時間後才喚醒進程
模型如 recvfrom 是系統調用
文檔中這麼描述的
select.select(rlist, wlist, xlist[, timeout])
This is a straightforward interface to the Unix select() system call. The first three arguments are sequences of ‘waitable objects’: either integers representing file descriptors or objects with a parameterless method named fileno() returning such an integer:
rlist: wait until ready for reading
wlist: wait until ready for writing
xlist: wait for an “exceptional condition” (see the manual page for what your system considers such a condition
Empty sequences are allowed, but acceptance of three empty sequences is platform-dependent. (It is known to work on Unix but not on Windows.) The optional timeout argument specifies a time-out as a floating point number in seconds. When the timeout argument
is omitted the function blocks until at least one file descriptor is ready. A time-out value of zero specifies a poll and never blocks.
The return value is a triple of lists of objects that are ready: subsets of the first three arguments. When the time-out is reached without a file descriptor becoming ready, three empty lists are returned.
Among the acceptable object types in the sequences are Python file objects (e.g. sys.stdin, or objects returned by open() or os.popen()), socket objects returned by socket.socket(). You may also define a wrapper class yourself, as long as it has an appropriate
fileno() method (that really returns a file descriptor, not just a random integer).
Note File objects on Windows are not acceptable, but sockets are. On Windows, the underlying select() function is provided by the WinSock library, and does not handle file descriptors that don’t originate from WinSock.
文檔中的大致意思:
這是一個直接調用unix中select()的簡單介面。前三個參數都是‘等待對象’的序列:整型的檔案描述符或者是一個無參數方法fileno()返回的整數:
* rlist 等待直到準備好寫
* wlist 等待直到準備好讀
* xlist 等待一種意外的情況 (在手冊中查看你的系統中認為的那種情況)
空序列也是允許的,但是能不能3個參數都為空白就要由你的系統決定了。(眾所都知unix下是行得,windows下不行)timeout指定了一個秒級的浮點型參數表示逾時時間當timeout參數為空白的時候省略了函數會阻塞直到至少有一個檔案描述符已經準備好了。
傳回值是三個已經準備好的列表,也是3個參數對象的子集。如果逾時了,返回的是三個空列表。其中列表中可以接收的參數類型是Python中的檔案參數(例如 sys.stdin 或者是 open() sys.popen()的返回對象),或者是 socket.socket的返回對象。你也可以自己封裝成一個類,只要適合fileno()方法
note:在windows中檔案對象是無法接受的,但是socket是可以使用的。
這裡並沒有原理的等的說明
其他網路資料
ref: http://www.cnblogs.com/coser/archive/2012/01/06/2315216.html
- select
- select
- select最早於1983年出現在4.2BSD中,它通過一個select()系統調用來監視多個檔案描述符的數組,當select()返回後,該數組中就緒的檔案描述符便會被核心修改標誌位,使得進程可以獲得這些檔案描述符從而進行後續的讀寫操作。
- select目前幾乎在所有的平台上支援,其良好跨平台支援也是它的一個優點,事實上從現在看來,這也是它所剩不多的優點之一。
- select的一個缺點在於單個進程能夠監視的檔案描述符的數量存在最大限制,在Linux上一般為1024,不過可以通過修改宏定義甚至重新編譯核心的方式提升這一限制。
- 另外,select()所維護的儲存大量檔案描述符的資料結構,隨著檔案描述符數量的增大,其複製的開銷也線性增長。同時,由於網路回應時間的延遲使得大量TCP串連處於非活躍狀態,但調用select()會對所有socket進行一次線性掃描,所以這也浪費了一定的開銷。
基本是一些概念的描述
代碼是課程中跟著老師寫的,弄懂了再整理。