【问题标题】:Skip iteration in loop if taking too long如果花费太长时间,则在循环中跳过迭代
【发布时间】:2021-12-30 15:22:43
【问题描述】:

我已经看过一些关于此的帖子,但无法找到直接的答案。

我有一个相当基本的循环。它为列表中的每个表名运行一些 SQL,并将该输出发送到 csv 文件。数据库中有几千个表,其中有一些只是海量的,而且查询需要很长时间。为了继续生活(并且由于这些数据不是非常重要,如果时间超过一分钟,我希望我的循环跳过迭代。

这是我的循环:

for t in tablelist:
    df = pd.read_sql(sql=f''' select * from [DB].[SCHEMA].[{t}] ''', con=conn)
    df.to_csv(path, index=None)

【问题讨论】:

    标签: python loops for-loop timeout skip


    【解决方案1】:

    你应该在另一个线程中运行 pd.read_sql,你可以使用这个实用功能:

    import time
    from threading import Thread
    
    class ThreadWithReturnValue(Thread):
        def __init__(self, group=None, target=None, name=None,
                     args=(), kwargs={}, Verbose=None):
            Thread.__init__(self, group, target, name, args, kwargs)
            self._return = None
        def run(self):
            print(type(self._target))
            if self._target is not None:
                self._return = self._target(*self._args,
                                                    **self._kwargs)
        def join(self, *args):
            Thread.join(self, *args)
            return self._return
    
    def call(f, *args, timeout = 5, **kwargs):
        i = 0
        t = ThreadWithReturnValue(target=f, args=args, kwargs=kwargs)
        t.daemon = True
        t.start()
        while True:
            if not t.is_alive():
                break
            if timeout == i:
                print("timeout")
                return
            time.sleep(1)
            i += 1
        return t.join()
    
    def read_sql(a,b,c, sql="", con=""):
        print(a, b, c, sql, con)
        t = 10
        while t > 0:
            # print("t=", t)
            time.sleep(1)
            t -= 1
        return "read_sql return value"
    
    conn = "conn"
    t = "t"
    print(call(read_sql, "a", "b", "c", timeout=10, sql=f''' select * from [DB].[SCHEMA].[{t}] ''', con=conn))
    

    我得到了this answer 的帮助。

    通过这些功能:

    for t in tablelist:
        df = call(pd.read_sql, timeout=yourTimeOutInSeconds , sql=f''' select * from [DB].[SCHEMA].[{t}] ''', con=conn)
        if df:
            df.to_csv(path, index=None)
    

    【讨论】:

      猜你喜欢
      • 2022-12-18
      • 1970-01-01
      • 2016-12-28
      • 2023-03-10
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      相关资源
      最近更新 更多