ftplib.FTP超时具有不一致的行为

时间:2015-02-10 10:34:58

标签: python python-2.7 ftp timeout ftplib

我正在尝试将带有超时选项的ftplib.FTP()用作特定主机名的某些超时值。但我遇到了奇怪的行为。为了测试它,我编写了一段非常简单的代码。

import ftplib
from ftplib import FTP
ftp = ftplib.FTP("google.com",timeout=2)

API文档表示以秒为单位输入超时值,但似乎需要更长的时间,对我而言,它几乎需要超过8秒。任何人都可以解释一下这个行为。我正在使用python2.7

2 个答案:

答案 0 :(得分:2)

ftplib.FTP调用socket.create_connection()。根据 到文档https://docs.python.org/2/library/socket.html#socket.create_connection

  

如果host是非数字主机名,它将尝试为两者解析它   AF_INET和AF_INET6,然后尝试连接到所有可能的   反过来,直到连接成功。

快速检查google.com会显示十几个(或更多) 取决于您所在国家/地区。你的2秒超时 适用于主机的每个

如果您想将总时间限制为2秒,请先执行查找并将数字地址传递给ftplib.FTP来电:

import socket, ftplib
host = socket.gethostbyname('google.com')
ftp = ftplib.FTP(host, timeout=2)

答案 1 :(得分:0)

来自ftplib.FTP docs

  

可选的timeout参数指定超时(以秒为单位)   阻止连接尝试等操作

,即超时可能会限制单个套接字操作,但它没有说明FTP()调用本身的持续时间。

作为@user590028 pointed out:FTP调用(间接)socket.create_connection(),可以按顺序调用多个阻塞操作,如果每个操作的时间少于超时秒,即使所有操作合并的时间更长,也可能成功。

如果要强制执行总超时,请参阅Timeout on a Python function call