我在python代码中通过ODBC连接连接到DB2服务器。在运行特定的服务器端任务时,DB2服务器会重新启动以进行维护,或者使我断开连接,一天执行一次或两次。那时,如果我的代码已开始执行pandas read_sql函数以获取查询结果,则即使服务器启动1小时后服务器启动,它也会陷入无限等待。
我想在read_sql的执行中添加一个超时,并且每当发生超时时,我都希望刷新与DB2服务器的连接,以便在继续查询之前再次建立一个新的连接。
我尝试过进行while循环并从DB2中选择数据块,而不是立即提取整个结果,但是问题是DB2在提取数据块python代码时是否断开仍然陷入无限等待。
chunk_size = 1000
offset = 0
while True:
sql = "SELECT * FROM table_name limit %d offset %d" % (chunk_size,offset)
df = pd.read_sql(sql, conn)
df.index += (offset+1)
offset += chunk_size
sys.stdout.write('.')
sys.stdout.flush()
if df.shape[0] < chunk_size:
break
如果sql执行需要3分钟以上,我需要read_sql引发一些异常或返回一个值。如果发生这种情况,我需要刷新与DB2的连接。
答案 0 :(得分:2)
您可以使用软件包func-timeout
。您可以通过pip进行安装,如下所示:
pip install func-timeout
因此,例如,如果您有一个函数“ doit(‘arg1’,‘arg2’)”想要限制运行5秒钟,则可以使用func_timeout如下调用:
from func_timeout import func_timeout, FunctionTimedOut
try:
doitReturnValue = func_timeout(5, doit, args=(‘arg1’, ‘arg2’))
except FunctionTimedOut:
print ( “doit(‘arg1’, ‘arg2’) could not complete within 5 seconds, hence terminated.\n”)
except Exception as e:
# Handle any exceptions that doit might raise here