ftplib.FTP timeout has inconsistent behaviour

后端 未结 2 789
清酒与你
清酒与你 2021-01-20 02:20

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 wr

相关标签:
2条回答
  • 2021-01-20 02:37

    From ftplib.FTP docs:

    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: 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.

    0 讨论(0)
  • 2021-01-20 02:54

    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)
    
    0 讨论(0)
提交回复
热议问题