Существует два режима: блокирующий и неблокирующий.
Блокировка
Ваш код схематично выглядит так:
while not stop:
message = read_message_from_socket(socket)
# do something with message
stop
- это переменная, котораяиспользуется, чтобы сигнализировать клиенту, что он должен прекратить обработку сообщений с сервера.
И read_message_from_socket
использует метод recv
для чтения данных с сервера.
В этом случае вызов recv
блокируется, что означает, что он не вернется, пока сервер не отправит некоторые данные.
Обратите внимание, что это очень упрощено, поскольку может случиться, что recv
вернет только часть ожидаемых данных, поэтому, вероятно, внутри read_message_from_socket
будет цикл для ожидания прочтения всего сообщения (он может основываться на известном размере сообщения или может полагаться на такой символ, какконец строки).
Non Blocking
В этом случае код клиента схематично выглядит так:
sel = selectors.DefaultSelector()
while not stop:
events = sel.select(timeout=None)
for key, mask in events:
service_connection(key, mask)
if mask & selectors.EVENT_READ:
socket = key.fileobj
message = read_actual_message_from_socket(socket)
# process the message
В этом случае вызов select
будет блокироваться, пока новые данные не поступят с сервера.И гарантируется, что read_actual_message_from_socket
будет считывать некоторые данные (так же, как и в предыдущем случае, он может получить только некоторую часть данных, поэтому это требует дополнительной обработки).
Более вводная информация об этом здесь и некоторые примеры здесь .