gpt4 book ai didi

Python,重新进入 `with` block

转载 作者:行者123 更新时间:2023-11-28 19:13:26 25 4
gpt4 key购买 nike

我目前正在开发一个导入脚本,该脚本从数据库中导入列表,该数据库每 15 分钟定期关闭一次以进行重新捕捉。

我创建了一个 with block ,如下所示,以在创建连接时处理重试机制:

class DBRetryController(object):
conn_obj = None
connection = None
cursor = None
retry_count_down = None
sleep_time = None

def __init__(self, conn_obj, retry_count_down=5, sleep_time=10):
self.conn_obj = conn_obj
self.retry_count_down = retry_count_down
self.sleep_time = sleep_time

def __enter__(self):
ex = None
while self.retry_count_down > 0:
try:
if hasattr(self.conn_obj, '__call__'):
self.connection = self.conn_obj()
else:
self.connection = self.conn_obj
self.cursor = self.connection.cursor()
self.retry_count_down = False
except OperationalError as ex:
log.warning('Caught db error, possibly due to sql server gone away, retrying in a few moment')
self.retry_count_down -= 1
time.sleep(self.sleep_time)
if ex:
raise ex
return self.connection, self.cursor

def __exit__(self, type, value, traceback):
try:
self.cursor.close()
self.connection.close()
except:
pass

if value:
raise value

并按如下方式使用:

with DBRetryController(self.connection) as (_, cursor):
cursor.execute(self.LISTING_QUERY)

但问题是在执行查询的过程中服务器可能会关闭,是否可以修改 DBRetryController 使嵌套的代码块重新进入?

最佳答案

如果我对你的问题理解正确,我认为你可以使用这样的方案:

notCompleted = 1
class TestClass():
def run(self):
global notCompleted
notCompleted = 1
#do_something here
notCompleted = 0


test = TestClass()
test.run()
while(notCompleted):
test.run()

假设我想确定,即使在执行 run() 方法期间发生任何错误,我的程序也会重新尝试完成以再次运行它。 notCompleted 默认为 1。当我在开始时调用 run 方法时,我将 1 分配给它,在我的 run 方法结束时,我分配了 0 给它。 run() 中的任何地方如果我有任何问题,在 while 循环中该函数将再次调用。

我认为您还需要添加一个 Try...Catch

关于Python,重新进入 `with` block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36854982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com