Почему `setblocking(False)` используется в реализации пары сокетов Python?Python

Программы на Python
Ответить
Anonymous
 Почему `setblocking(False)` используется в реализации пары сокетов Python?

Сообщение Anonymous »

Я просматривал реализацию пары сокетов на Python, которая использует стандартные сокеты. Вот фрагмент кода, который я нашел:

Код: Выделить всё

def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0):
if family == AF_INET:
host = _LOCALHOST
elif family == AF_INET6:
host = _LOCALHOST_V6
else:
raise ValueError("Only AF_INET and AF_INET6 socket address families "
"are supported")
if type != SOCK_STREAM:
raise ValueError("Only SOCK_STREAM socket type is supported")
if proto != 0:
raise ValueError("Only protocol zero is supported")

# We create a connected TCP socket. Note the trick with
# setblocking(False) that prevents us from having to create a thread.
lsock = socket(family, type, proto)
try:
lsock.bind((host, 0))
lsock.listen()
addr, port = lsock.getsockname()[:2]
csock = socket(family, type, proto)
try:
csock.setblocking(False)
try:
csock.connect((addr, port))
except (BlockingIOError, InterruptedError):
pass
csock.setblocking(True)
ssock, _ = lsock.accept()
except:
csock.close()
raise
finally:
lsock.close()
return (ssock, csock)
В реализации упоминается, что setblocking(False) необходим, чтобы «не допустить создания потока», но я не могу понять, зачем это требуется.
Сначала я думал, что пропуск setblocking(False) может привести к взаимоблокировке или блокировке, но после тестирования как в Linux, так и в Windows код, похоже, работает нормально и без него. , и вызов подключения не блокировать.
Итак, мой вопрос:

[*]Какую конкретную проблему решает setblocking(False)? решить здесь?
[*]Существуют ли специфичные для платформы сценарии или крайние случаи, когда отсутствие setblocking(False) может вызвать проблемы?

Будем очень признательны за любую информацию о таком поведении.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ementation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»