2011-03-08 43 views
4
  1. 在Python中使用select.select時應該將套接字設置爲非阻塞嗎?
  2. 如果它們是或不是,它們會有什麼不同?

偶爾我發現在一個返回可發送的套接字上調用send會阻塞。此外,我發現blocking套接字通常會發送給定的整個緩衝區(128 KiB)。在非阻塞模式下,發送將接受少得多的字節(與之前給出的示例相比,爲20-40 KiB),並且返回更快。我正在使用Python 3.1 on Lucid套接字是否應該與Python中的select一起工作?

+0

難道你不是指「在可返回可讀性的套接字上調用'recv'」嗎? – Mat 2011-03-08 20:14:23

+0

@Mat:是的。 – 2011-03-09 02:25:28

回答

5

不幸的是,答案可能與操作系統有關。我只回答關於Linux。

我不知道的差異關於選擇阻塞/非阻塞套接字,但在Linux上,select系統調用手冊頁有這個在它的BUGS「部分:

在Linux下,選擇()可能會報告 套接字文件描述符爲「準備好讀取 」,而後續的讀取塊仍爲 。這可能是 例如發生在數據有 抵達但檢查時有 錯誤的校驗和並被丟棄。可能存在其他 情況,其中 描述符虛假地報告爲 就緒。因此,在不應該使用 塊的套接字上使用 O_NONBLOCK可能會更安全。

我懷疑上面的python抽象可以「隱藏」這個問題沒有副作用。

至於阻塞寫發送更多的數據,這是預期的。 send將阻塞,直到有足夠的緩衝區空間在套接字阻塞時傳遞整個請求。如果套接字是非阻塞的,它只會發送儘可能多的套接字發送緩衝區。

+1

一個美妙的答案。正是我在找什麼。 – 2011-03-09 02:24:29

相關問題