1

ソケットから読み取り、正確なサイズのデータ​​を返す関数を作成しています。そして、次のようなコードを考えました:

whlie len(buf) < required:
    buf += socket.recv(required - len(buf))

return buf

しかし、これはCPUリソースを浪費する可能性があると思います(わかりません)。ソケットから正確な量のデータを返すシステムコールまたは何かを探していますが、必要なサイズが受信されるまでブロックされる可能性があります。

4

3 に答える 3

2

これにより、CPU リソースが浪費されることはありません。

sock.recv少なくとも 1 バイトが使用可能になるまでブロックされます (ただし、使用可能な場合は複数のバイトがバッファリングされて返される可能性があります)。そのため、アプリケーションはビジー ループに入りません。

sock.recv一般に、呼び出しのバッファー長は、取得するメッセージの長さとは関係ありません


ただし、文字列連結はバッファにとって効率的ではありません。

以下の使用を検討してください。

  • リスト、および''.join()( b''.join()Python 3 を使用している場合)
  • およびモジュール (またはPython 3 を使用している場合) StringIOcStringIOio.BytesIO
  • sock.recv_intoStringIO/を使用しbytesIOます。
于 2013-07-07T03:06:48.133 に答える
0

デフォルトのソケット ライブラリを使用している場合は、以下を使用できます。

import socket
host, port = "localhost", 8000
num_bytes  = 5000

sock = socket.socket()
sock.connect((host, port))
while True:
    data = sock.recv(num_bytes)
    handle(data)

ここで可能なパラメータを見ることができますsocket.recv documentation

于 2013-07-07T02:57:50.283 に答える