ソケットのブロックとノンブロックを設定する方法

ネットワーク通信でソケットを使用するとき、ソケットにブロッキングモードまたはノンブロッキングモードを設定できます。

ブロッキングモードでは、ソケットに対する読み取りと書き込みの操作を実行すると、データを読み取れないか、すぐに書き込めない場合、現在のスレッドはデータを読み取れるまで、または書き込めるようになるまでブロックされます。

非ブロッキングモードでは、ソケットの読み書き処理実行時に、データの読み取りができない、または直ちに書き込めない場合、現在のスレッドはブロックされずにエラーコードを即座に返します。その後、ソケットの状態を継続的にポーリングすることで、データの読み取りが可能かどうか、またはデータの書き込みが可能かどうかを判断できます。

ソケットを非ブロックモードにするには、`socket.setblocking(False)` メソッドを使用します。このメソッドはブール値のパラメータを受け取り、False に設定することでソケットを非ブロックモードに設定します。ブロックモードに戻すには、`socket.setblocking(True)` を使用します。

非同期処理のサンプルコード: ソケットを非ブロックモードに設定する方法

import socket
# 创建一个TCP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 将socket设置为非阻塞模式
sock.setblocking(False)
# 连接到服务器
sock.connect(('www.example.com', 80))
# 发送数据
sock.send('GET / HTTP/1.1\r\nHost: www.example.com\r\n\r\n')
# 接收数据
data = ''
while True:
try:
chunk = sock.recv(1024)
if not chunk:
break
data += chunk
except socket.error:
pass
# 关闭socket
sock.close()
# 打印接收到的数据
print(data)

この例では、ソケットを非ブロッキングモードに設定するには sock.setblocking(False) を使用し、データを受信するときには socket.error 例外を発生させて、非ブロッキングモードで発生したエラーコードを処理します。

bannerAds