簡體   English   中英

讀取時非阻塞Python套接字的超時值是多少?

[英]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將立即使用EAGAINEWOULDBLOCK返回。 當另一端關閉連接時, read將返回值為0

讀取超時僅在“阻塞”狀態下才有意義,在這種情況下,經過等於超時的時間並且沒有要讀取的數據之后,讀取應返回EAGAINEWOULDBLOCK

通常,這不會影響write超時。 當您將套接字設置為非阻塞時,如果“寫緩沖區”已滿(除非有相當“慢”的接收器,否則這種情況很少發生),並且如果write可能被阻塞,則應立即使用EAGAINEWOULDBLOCK返回,然后應用程序有責任確保再次發出write操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM