“MySQL服务器已经消失了”和持久的进程

2024-09-22 10:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我们使用Django来运行模型模拟。代码作为cronscript(不是通过wsgi)运行,并记录模拟是否成功运行。 在modelsimulation开始时,会创建一个statusobject,其中status RUNNING处于运行状态。在modelsimulation结束时,此statusobject将更新为SUCCESS或FAILED。(伪)代码如下所示:

def mainRoutine():
    myStatusObject = createStatusObject()
    try:
        runModelSimulation()  # this runs the modelsimulation
    except:
        updateStatus(myStatusObject,'FAILED')
    updateStatus(myStatusObject,'SUCCESS')

def createStatusObject():
    myStatusObject = models.StatusObject()
    myStatusObject.task = 'somename'
    myStatusObject.status = 'RUNNING'
    myStatusObject.save()
    return myStatusObject

def updateStatus(myStatusObject, newstatus):
    myStatusObject.status = newstatus
    myStatusObject.save()

当modelsimulation需要很长时间(可以模拟几个小时到几天)时,问题就开始了。然后是到MySQL数据库的连接错误,错误为“MySQL server已经消失”。我从其他帖子中了解到,这与数据库的某些连接有关(这可以通过摆弄MySQL的服务器端配置来解决)。你知道吗

目前我找到了一个解决方法,通过传递statusobject的ID,而不是statusobject实例。在updateStatus子例程中,我使用get(ID=thisID)在更新之前检索正确的statusObject实例。这不会产生超时。你知道吗

def updateStatus(myStatusObjectID, newstatus):
    myStatusObject = StatusObject.objects.get(id=myStatusObjectID)
    myStatusObject.status = newstatus
    myStatusObject.save()

问题解决了?!但是,我们还有其他类似于statusobject的对象,可能会遇到类似的问题。所以我想了解为什么这个连接仍然是开放的。传递StatusObject实例和传递StatusObject ID与.get()的组合有什么区别?连接是在什么时候建立的,如何防止此连接保持打开状态?我们可以告诉django在.save()之后关闭连接,并在实例的下一次更新时重新打开它吗。 另外,因为传递StatusObject实例比根据其属性搜索并重新打开它更容易。你知道吗


Tags: 实例代码idgetsavedefstatusmysql
1条回答
网友
1楼 · 发布于 2024-09-22 10:23:41

在modelsimulation之前关闭到MySQL的连接。Django将在myStatusObject.save()调用时自动重新连接到sql server。你知道吗

from django.db import connection

def mainRoutine():
    myStatusObject = createStatusObject()
    connection.close()
    try:
        runModelSimulation()  # this runs the modelsimulation
    except:
        updateStatus(myStatusObject,'FAILED')
    updateStatus(myStatusObject,'SUCCESS')

相关问题 更多 >