我想用时间线程终止正在运行的查询。我尝试过不同的实现,但似乎什么都不管用。
现在我调用函数executetimedquery,它启动一个10秒的计时器,如果查询运行时间太长,就会执行这个计时器。在self.cursor.execute(self.query)开始运行时,这是我想在10秒后终止的长时间运行的查询。出于某种原因,即使计时器中的函数被启动,游标仍在运行长时间运行的查询,并且不会运行kill connection{pid};命令;。它等待长查询完成,然后在结束时终止连接。
我做错了什么?最好的解决方法是什么?我现在非常迫切地想找到一个解决办法
到目前为止,我有以下代码:
def killDBConnection(self, processId):
'''
This takes in a processId, which is the mysql cursor connection process
id.
'''
killQuery = 'KILL CONNECTION {pId};'.format(pId=processId)
try:
self.cursor.execute(killQuery)
except:
print('Testing')
return 'temp'
def executeTimedQuery(self, ret):
'''
This takes in a dictionary.
'''
pID = self.getProcessId()
try:
Timer(10.0, self.killDBConnection, [pID]).start()
self.cursor.execute(self.query)
ret['executable'] = True
ret['data'] = self.cursor.fetchall()
ret['headers'] = tuple([col[0] for col in self.cursor.description])
t.cancel()
except:
print('executeTimedQuery - Last executed query: ', self.cursor._last_executed)
return ret
1条答案
按热度按时间bvuwiixz1#
上面的示例一直失败,因为我试图在仍在处理长时间运行的查询的同一mysql线程上执行“kill pid”查询。“kill pid”是在长时间运行的查询完成之后才运行的,这不是我想要的。长话短说,终止长时间运行的查询的方法是打开另一个连接,用kill pid终止长时间运行的查询。现在,在执行长时间运行的查询之前,获取正确的pid是非常重要的。
最初,我编写了一个类,它初始化了一个连接和游标,并且可以在函数中的任何位置进行访问。我没有这样做,而是编写了一个函数,可以在调用时为我创建连接。我为长时间运行的查询和kill query函数初始化了一个连接。我从长时间运行的查询中获得了进程id,然后使用一个定时线程在一定时间后启动“kill pid”。
以下是一个框架/大部分代码:
顺便说一句,我尝试了各种各样的方法,但都失败了,但这次失败了。