如果花费的时间太长,则跳过循环中的迭代
Skip iteration in loop if taking too long
我已经看过一些关于此的帖子,但未能找到直接的答案。
我有一个相当基本的循环。它为列表中的每个 table 名称运行一些 SQL,并将该输出发送到 csv 文件。数据库中有几千个 table,其中有几个非常庞大,查询需要很长时间。为了继续生活(并且由于这些数据不是非常重要,如果时间超过一分钟,我希望我的循环跳过一次迭代。
这是我的循环:
for t in tablelist:
df = pd.read_sql(sql=f''' select * from [DB].[SCHEMA].[{t}] ''', con=conn)
df.to_csv(path, index=None)
你应该 运行 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)
我已经看过一些关于此的帖子,但未能找到直接的答案。
我有一个相当基本的循环。它为列表中的每个 table 名称运行一些 SQL,并将该输出发送到 csv 文件。数据库中有几千个 table,其中有几个非常庞大,查询需要很长时间。为了继续生活(并且由于这些数据不是非常重要,如果时间超过一分钟,我希望我的循环跳过一次迭代。
这是我的循环:
for t in tablelist:
df = pd.read_sql(sql=f''' select * from [DB].[SCHEMA].[{t}] ''', con=conn)
df.to_csv(path, index=None)
你应该 运行 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)