Python DBAPI тайм-аут для соединений? - PullRequest
0 голосов
/ 01 марта 2010

Я пытался проверить на наличие сбоя соединения, и, к сожалению, он не дает сбоя, если IP-адрес хоста защищен огнем.

Это код:

def get_connection(self, conn_data):
    rtu, hst, prt, usr, pwd, db = conn_data  
    try:
        self.conn = pgdb.connect(host=hst+":"+prt, user=usr, password=pwd, database=db)
        self.cur = self.conn.cursor()
        return True
    except pgdb.Error as e:
        logger.exception("Error trying to connect to the server.")
        return False

if self.get_connection(conn_data):
    # Do stuff here:

Если я попытаюсь подключиться к известному серверу, но укажу неправильное имя пользователя, произойдет исключение и произойдет сбой.

Однако, если я пытаюсь подключиться к машине, которая не отвечает (с брандмауэром), она никогда не будет передана self.conn = pgdb.connect()

Как подождать или проверить время ожидания, а не зависать мое приложение, когда пользователь вводит неправильный IP-адрес?

Ответы [ 2 ]

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

Обычно вы можете передать аргумент тайм-аута в функцию соединения. Если он не существует, вы можете попробовать использовать socket.timeout или timeout по умолчанию :

import socket
socket.setdefaulttimeout(10) # sets timeout to 10 seconds

Этот параметр будет применяться ко всем выполняемым вами соединениям (на основе сокетов) и завершится ошибкой через 10 секунд ожидания.

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

То, что вы испытываете, - это боль брандмауэров, а время ожидания - это обычное время ожидания TCP.

...