[英]What is the timeout value for a non-blocking Python socket when reading?
我正在使用Python 2.7,並且正在使用一些舊代碼。 它將套接字設置為非阻塞模式,並具有:
self._socket.setblocking(0)
self._socket.settimeout(0)
我的問題是,進行讀取時,什么決定了套接字上的超時? 它是操作系統上TCP堆棧使用的默認值嗎? 如果是這樣,在Linux上將如何更改? 另外,寫入超時是否與讀取超時相同?
根據文檔 (重點是我的):
在非阻塞模式下,如果
recv()
調用未找到任何數據,或者send()
調用無法立即處理數據,則會引發error
異常。
因此,似乎“超時”是即時檢查。 如果在調用該函數時沒有可用數據或無法完全進行寫操作,則會收到異常。
以下是來自socket.settimeout
的幫助
socket._socket對象實例的settimeout(...)方法settimeout(timeout)
設置套接字操作超時。 “超時”可以是浮點數(以秒為單位),也可以是“無”。 將超時設置為None將禁用超時功能,並且等效於
setblocking(1)
。 將超時設置為零與setblocking(0)
相同。
所以我不確定為什么setblocking(0)
和settimeout(0)
都在上面完成。 這意味着如果沒有可用數據, read
將立即使用EAGAIN
或EWOULDBLOCK
返回。 當另一端關閉連接時, read
將返回值為0
。
讀取超時僅在“阻塞”狀態下才有意義,在這種情況下,經過等於超時的時間並且沒有要讀取的數據之后,讀取應返回EAGAIN
或EWOULDBLOCK
。
通常,這不會影響write
超時。 當您將套接字設置為非阻塞時,如果“寫緩沖區”已滿(除非有相當“慢”的接收器,否則這種情況很少發生),並且如果write
可能被阻塞,則應立即使用EAGAIN
或EWOULDBLOCK
返回,然后應用程序有責任確保再次發出write
操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.