Операторы печати будут выполняться всякий раз, когда генератор переименован. Если вы просто хотите посмотреть, что печатает итератор, вы можете вызвать его в понимании списка, не сохраняя результат.
def testFunc(arg1):
print arg1
yield arg1
>>> [_ for _ in testFunc(1)]
1
[1]
Спецификация TCP говорит, что соединения идентифицируются кортежем:
{local addr, local port, remote addr, remote port}
Исходя из этого, теоретически не должно быть конфликта между локальным портом, используемым в существующем соединении, и попыткой связать это. тот же порт для прослушивания сервером, поскольку прослушивающий сокет не имеет удаленного адреса / порта (они представлены в спецификации подстановочными знаками).
Однако, большинство реализаций TCP, включая API сокетов Unix, являются более строгими, чем эта. Если локальный порт уже используется в каком-либо существующем сокете, вы не сможете связать его, вы получите ошибку EADDRINUSE
. Специальное исключение делается, если все существующие сокеты находятся в состоянии TIME_WAIT
, а новый сокет имеет опцию сокета SO_REUSEADDR
; это используется для перезапуска сервера, пока сокеты, оставшиеся от предыдущего процесса, все еще ожидают истечения времени ожидания.
По этой причине диапазон портов обычно делится на диапазоны с различным использованием. Когда сокет не связывает локальный порт (либо потому, что он просто вызвал connect()
без вызова bind()
, либо путем указания IPPORT_ANY
в качестве порта в bind()
), порт выбирается из эфемерного диапазон, который обычно очень пронумерован портами. С другой стороны, ожидается, что серверы будут привязаны к портам с низким номером. Если сетевые приложения следуют этому соглашению, вы не должны сталкиваться с конфликтами.