- 在Python中使用
select.select
時應該將套接字設置爲非阻塞嗎? - 如果它們是或不是,它們會有什麼不同?
偶爾我發現在一個返回可發送的套接字上調用send
會阻塞。此外,我發現blocking套接字通常會發送給定的整個緩衝區(128 KiB)。在非阻塞模式下,發送將接受少得多的字節(與之前給出的示例相比,爲20-40 KiB),並且返回更快。我正在使用Python 3.1 on Lucid。套接字是否應該與Python中的select一起工作?
select.select
時應該將套接字設置爲非阻塞嗎?偶爾我發現在一個返回可發送的套接字上調用send
會阻塞。此外,我發現blocking套接字通常會發送給定的整個緩衝區(128 KiB)。在非阻塞模式下,發送將接受少得多的字節(與之前給出的示例相比,爲20-40 KiB),並且返回更快。我正在使用Python 3.1 on Lucid。套接字是否應該與Python中的select一起工作?
不幸的是,答案可能與操作系統有關。我只回答關於Linux。
我不知道的差異關於選擇阻塞/非阻塞套接字,但在Linux上,select
系統調用手冊頁有這個在它的BUGS「部分:
在Linux下,選擇()可能會報告 套接字文件描述符爲「準備好讀取 」,而後續的讀取塊仍爲 。這可能是 例如發生在數據有 抵達但檢查時有 錯誤的校驗和並被丟棄。可能存在其他 情況,其中 描述符虛假地報告爲 就緒。因此,在不應該使用 塊的套接字上使用 O_NONBLOCK可能會更安全。
我懷疑上面的python抽象可以「隱藏」這個問題沒有副作用。
至於阻塞寫發送更多的數據,這是預期的。 send
將阻塞,直到有足夠的緩衝區空間在套接字阻塞時傳遞整個請求。如果套接字是非阻塞的,它只會發送儘可能多的套接字發送緩衝區。
一個美妙的答案。正是我在找什麼。 – 2011-03-09 02:24:29
難道你不是指「在可返回可讀性的套接字上調用'recv'」嗎? – Mat 2011-03-08 20:14:23
@Mat:是的。 – 2011-03-09 02:25:28