我使用sqlachemy连接到远程数据库,但我不知道类型(可以是PostgreSQL,MariaDB等)。我在循环中尝试它们,并保留第一个工作驱动程序:
for driver in drivers:
try:
uri = get_uri_from_driver(driver)
engine = create_engine(uri, echo=False)
print('Try connection')
con = engine.engine.connect()
# Try to get some lines
return engine
except Exception:
continue
return None
在某些情况下, con = engine.engine.connect()不会结束,当您尝试使用MySQL驱动程序连接到非MySQL(Oracle)的东西时会发生这种情况。
问题:
如何设置超时?
如果我不能,还有其他方法可以达到这个目的吗? (例如,我将使用默认端口建立测试订单,但我希望能在几秒钟后终止连接()。
编辑:
此代码位于Django中,因此我无法使用信号/闹钟,因为多线程。
答案 0 :(得分:1)
这可以通过如下的通用超时解决方案来完成:
What should I do if socket.setdefaulttimeout() is not working?
import signal
class Timeout():
"""Timeout class using ALARM signal"""
class TimeoutException(Exception): pass
def __init__(self, sec):
self.sec = sec
def __enter__(self):
signal.signal(signal.SIGALRM, self.raise_timeout)
signal.alarm(self.sec)
def __exit__(self, *args):
signal.alarm(0) # disable alarm
def raise_timeout(self, *args):
raise Timeout.TimeoutException()
# In your example
try:
uri = get_uri_from_driver(driver)
engine = create_engine(uri, echo=False)
print('Try connection')
with Timeout(10):
con = engine.engine.connect()
# Try to get some lines
return engine
except Exception:
continue