Python: контроль времени ожидания - PullRequest
4 голосов
/ 01 марта 2010

У меня есть код, подобный следующему, выполняющемуся в скрипте:

try:
    s = ftplib.FTP('xxx.xxx.xxx.xxx','username','password')

except: 
    print ('Could not contact FTP serer')
    sys.exit()

ЕСЛИ FTP-сайт недоступен, сценарий почти "зависает" ... В среднем требуется около 75 секунд, прежде чем sys.exit () будет вызван ... Я знаю, что 75 секунд, вероятно, очень субъективно и зависит от системы, на которой он работает ... но есть ли способ заставить python просто попробовать это один раз, и, если это не удастся, немедленно выйти? Платформа, которую я использую для этого, - Mac OS X 10.5 / python 2.5.1.

Ответы [ 5 ]

7 голосов
/ 01 марта 2010

Начиная с 2.6, FTP constructor имеет необязательный параметр timeout:

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])

Возвращает новый экземпляр класса FTP. Когда хост указан, вызывается метод connect (хост). Когда пользователю дается, дополнительно выполняется вызов метода login (user, passwd, acct) (где passwd и acct по умолчанию равны пустой строке, если не задано). Необязательный параметр timeout указывает время ожидания в секундах для операций блокировки , например, попытка подключения (если не указано, будет использоваться глобальная настройка времени ожидания по умолчанию).

Изменено в версии 2.6: добавлено время ожидания.

Начиная с версии 2.3 и выше, можно использовать глобальное время ожидания по умолчанию:

socket.setdefaulttimeout(timeout)

Установить время ожидания по умолчанию в плавающих секундах для новых объектов сокетов. Значение None указывает, что у новых объектов сокета нет времени ожидания. Когда модуль сокета впервые импортируется, по умолчанию используется Нет.

Новое в версии 2.3.

2 голосов
/ 01 марта 2010

, поскольку вы находитесь на python 2.5, вы можете установить глобальное время ожидания для всех операций сокетов (включая запросы FTP), используя:

socket.setdefaulttimeout()

(это было добавлено в Python 2.3)

1 голос
/ 28 апреля 2010

Комментарий к тем, кто предлагает использовать socket.setdefaulttimeout (). Внутренне ftplib использует sock.makefile (). Согласно документации по Python, вы не должны смешивать makefile () с таймаутами. В частности: http://docs.python.org/library/socket.html#socket.socket.makefile

Конечно, я не могу сказать, что видел какие-то проблемы, просто меня это беспокоит.

1 голос
/ 01 марта 2010

если вы посмотрите на документ , есть параметр тайм-аута.

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])¶

может быть, вы можете использовать это.

1 голос
/ 01 марта 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...