Pythonでselect関数の使い方は何ですか?
Pythonにおいて、select()は複数の入力ソケットを監視するための関数です。複数のファイルオブジェクト(ソケットを含む)の読み書き状態を同時に監視し、その中のどれかが準備完了(読み込み可能または書き込み可能)であるとき、select()関数はそのファイルオブジェクトを返します。
select() 関数の基本的な構文は以下のようになります:
read_list, write_list, error_list = select.select(inputs, outputs, exceptions, timeout)
パラメータ説明:
- 入力:監視が必要な読み取り可能なオブジェクトのリスト。
- 出力:監視対象の書き込み可能なオブジェクトのリスト。
- 例外:監視すべき例外オブジェクトのリスト。
- タイムアウト:オプションのパラメーターで、タイムアウト時間を秒単位で設定します(デフォルトはブロッキング状態で、準備ができたオブジェクトがあるまで)。
戻り値の説明:
- read_list: 準備が整ったオブジェクトの一覧。
- write_list: 準備ができたオブジェクトの書き込みリスト。
- エラーリスト:準備完了しているオブジェクト。
使用例:
import select
import socket
# 创建套接字并监听
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8000))
server_socket.listen(5)
inputs = [server_socket]
while True:
# 使用select函数进行监视
readable, writable, exceptional = select.select(inputs, [], [])
for sock in readable:
if sock is server_socket:
# 有新的连接请求
client_socket, client_address = server_socket.accept()
inputs.append(client_socket)
else:
# 有数据可读
data = sock.recv(1024)
if data:
print('Received:', data.decode())
else:
# 客户端断开连接
sock.close()
inputs.remove(sock)
上記の例では、 select() 関数を使用してソケットオブジェクトの読み取り状態を監視します。 新しい接続要求がある場合は、新しいクライアントソケットを inputs リストに追加し、クライアントがデータを送信すると、そのデータを出力します。