python - venta - El tiempo de espera de ftplib.FTP tiene un comportamiento incoherente
punto de venta en python (2)
Estoy tratando de usar ftplib.FTP()
con la opción de tiempo de espera como un valor de tiempo de espera para un nombre de host particular. Pero estoy experimentando un comportamiento extraño. Para probarlo, he escrito un código muy simple.
import ftplib
from ftplib import FTP
ftp = ftplib.FTP("google.com",timeout=2)
El documento API dice que ingrese el valor de tiempo de espera en segundos, pero parece que lleva más tiempo que eso, para mí casi lleva más de 8 segundos. ¿Alguien puede explicar el comportamiento? Estoy usando python2.7
Desde ftplib.FTP
documentos :
El parámetro de tiempo de espera opcional especifica un tiempo de espera en segundos para operaciones de bloqueo como el intento de conexión
es decir, el tiempo de espera puede limitar las operaciones de socket individuales, pero no dice nada sobre la duración de la llamada FTP()
.
Como señaló @ user590028 : llamadas FTP (indirectamente) socket.create_connection()
que pueden invocar varias operaciones de bloqueo en secuencia y puede tener éxito si cada operación lleva menos tiempo de espera segundos, incluso si todas las operaciones combinadas toman más tiempo.
Si desea aplicar el tiempo de espera total, consulte Tiempo de espera en una llamada de función de Python .
ftplib.FTP
invoca socket.create_connection()
. De acuerdo con los documentos https://docs.python.org/2/library/socket.html#socket.create_connection
si el host es un nombre de host no numérico, intentará resolverlo tanto para AF_INET como para AF_INET6, y luego intentará conectarse a todas las direcciones posibles hasta que la conexión tenga éxito.
Una comprobación rápida de google.com
mostrará aproximadamente una docena (o más) dependiendo de su región del país. Su tiempo de espera de 2 segundos se aplica a cada uno de los hosts.
Si desea limitar el tiempo total a 2 segundos, realice la búsqueda primero y pase la dirección numérica a su llamada ftplib.FTP
:
import socket, ftplib
host = socket.gethostbyname(''google.com'')
ftp = ftplib.FTP(host, timeout=2)