4

ソケットをノンブロッキングに設定しましたが、seclect() 関数はまだブロックされています。私を助けてください。

これは私のコードです:

import socket
import select
if __name__ == '__main__':
   server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
   server.bind(("localhost",9006))
   server.listen(10)
   server.setblocking(False)
   inputs = [server]
   while True:
      try:
         a,b,c = select.select(inputs, [], [])
      except Exception:
        print ("exception")
      print ("Timeout") 
4

1 に答える 1

16

選択したドキュメントから:

オプションのtimeout引数は、タイムアウトを秒単位の浮動小数点数として指定します。タイムアウト引数を省略すると、少なくとも1つのファイル記述子の準備ができるまで関数がブロックされます。

つまり、ソケットの「ブロッキング」状態はここでは関係ありません。ブロッキングを無効にするには、タイムアウトを指定する必要があります。0読み取るものがなくなったときにすぐに戻るように設定できます(ただし、ループがCPUを大量に占有することに注意してください)。

例えば:

a,b,c = select.select(inputs, [], [], 0)
于 2012-08-02T02:19:02.573 に答える