Python DBAPI 连接超时问题?

0 投票
2 回答
1422 浏览
提问于 2025-04-15 19:51

我在尝试测试连接失败的情况,但不幸的是,如果主机的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

你遇到的情况是防火墙带来的麻烦,而超时是正常的TCP超时现象。

0

你通常可以在连接函数里设置一个超时时间。如果没有这个选项,你可以试试使用socket.timeout或者默认超时设置

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

这个设置会对你所有的连接(基于socket的连接)生效,如果等了10秒还没成功,就会失败。

撰写回答