あなたが背景IOが必要な場合は、IOを処理する新しいスレッドを生成することは、おそらく最も簡単な方法です:
import socket
import threading
import queue
class ClientReceiver(threading.Thread):
RECV_BUF_SIZE = 1024
QUEUE_SIZE = 2
def __init__(self, sock, recv_buf_size=None, queue_size=None, *args, **kwargs):
super(ClientReceiver, self).__init__(*args, **kwargs)
# set thread as daemon thread, we don't want to
# wait for this thread on interpreter exit.
self.setDaemon(True)
self.sock = sock
self.recv_buf_size = recv_buf_size or self.RECV_BUF_SIZE
self.queue_size = queue_size or self.QUEUE_SIZE
def run(self):
sock = self.sock
try:
while True:
data = sock.recv(self.recv_buf_size)
self.queue.put(data)
except Exception as ex:
# handle errors
raise
# Usage example:
sock = ...
receiver = ClientReceiver(sock)
receiver.start()
data = receiver.queue.get(block=False)
スレッドはすぐにそれが利用可能であり、キューに格納しますように、ネットワークからデータを取得します。キューがいっぱいになるとスレッドがブロックされ、別の戦略が必要なのかもしれません。
いつでもキューからデータを取得するには、receiver.queue
を使用します。
これは適切なクライアントソケットシャットダウンのコードがありませんが、おそらく基本的な考え方が得られます。
どのようなタイプのソケットは 'sock'ですか? *受信していない(またはむしろパケットが欠落している)という概念全体がデータグラムソケットのためだけに意味があるからです... – dhke
socket.AF_INET、socket.SOCK_STREAMで作成されたソケット – taz
あなたは* *を受け取る? 'SOCK_STREAM'はあなたに逐次配送を保証しますので、データを忘れることはできません。データは、非ブロッキングIOであっても、あなたがアクセスしていない間に接続が壊れていない限り、ソケットバッファーであなたを待っていますが、適切なエラーメッセージが表示されます。 – dhke