Код: Выделить всё
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) может привести к взаимоблокировке или блокировке, но после тестирования как в Linux, так и в Windows код, похоже, работает нормально и без него. , и вызов подключения не блокировать.
Итак, мой вопрос:
[*]Какую конкретную проблему решает setblocking(False)? решить здесь?
[*]Существуют ли специфичные для платформы сценарии или крайние случаи, когда отсутствие setblocking(False) может вызвать проблемы?
Будем очень признательны за любую информацию о таком поведении.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ementation
Мобильная версия