Question: I am trying to use `ftplib.FTP()` with timeout option as some timeout value for a particular hostname. But i am experiencing weird behaviour. To test it i have written a very simple piece of code.

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

```

The API document says to enter timeout value in seconds, but it seems that it takes longer than that, for me it almost takes more than 8 secs. Can anybody please explain the behaviour.I am using python2.7

Answer: 
`ftplib.FTP` invokes `socket.create_connection()`. According
to the docs <https://docs.python.org/2/library/socket.html#socket.create_connection>

> 
> if host is a non-numeric hostname, it will try to resolve it for both
>  AF\_INET and AF\_INET6, and then try to connect to all possible
>  addresses in turn until a connection succeeds.
> 
> 
> 

A quick check of `google.com` will show about a dozen (or more) 
depending on your region of the country. Your 2 second timeout
is applied to *each* of the hosts.

If you want to limit total time to 2 seconds, do the lookup first and pass the numeric address to your `ftplib.FTP` call:

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

```
From [`ftplib.FTP` docs](https://docs.python.org/2/library/ftplib.html#ftplib.FTP):

> 
> The optional timeout parameter specifies a timeout in seconds for
>  blocking operations like the connection attempt
> 
> 
> 

i.e., the timeout may limit individual socket operations but it says nothing about the duration of the `FTP()` call itself.

As [@user590028 pointed out](https://stackoverflow.com/a/28511499/4279): FTP calls (indirectly) `socket.create_connection()` that may invoke several blocking operations in sequence and it may succeed if each operation takes less than timeout seconds even if all operations combined take longer.

If you want to enforce the total timeout, see [Timeout on a Python function call](https://stackoverflow.com/q/492519/4279).