有什么办法可以在熊猫read_sql函数中设置超时时间?

时间:2019-06-06 08:45:59

标签: python-3.x pandas sqlalchemy odbc pyodbc

我在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的连接。

1 个答案:

答案 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