在长时间运行的芹菜任务中使用SQLAlchemy对象

在长时间运行的芹菜任务中使用SQLAlchemy对象,sqlalchemy,celery,Sqlalchemy,Celery,我有一个长时间运行的任务更新一些SQLAlchemy对象。在任务开始时打开会话,在此过程中进行更新,并在任务结束时提交事务。问题是任务运行时间很长,因此在提交之前,连接就已经关闭(超时,“消失”,不管你想怎么称呼它)。这将导致提交失败和整个任务失败 这似乎绝对是一种正确的方法,可以向数据库写入短任务或与芹菜无关的内容。但如果任务耗时太长,这肯定是一个问题 还有其他推荐的模式吗?芹菜任务是否应该甚至不使用SQLAlchemy对象,而是使用某种静态类,其数据可以用于更新实际的SQLAlchemy对象

我有一个长时间运行的任务更新一些SQLAlchemy对象。在任务开始时打开会话,在此过程中进行更新,并在任务结束时提交事务。问题是任务运行时间很长,因此在提交之前,连接就已经关闭(超时,“消失”,不管你想怎么称呼它)。这将导致提交失败和整个任务失败

这似乎绝对是一种正确的方法,可以向数据库写入短任务或与芹菜无关的内容。但如果任务耗时太长,这肯定是一个问题


还有其他推荐的模式吗?芹菜任务是否应该甚至不使用SQLAlchemy对象,而是使用某种静态类,其数据可以用于更新实际的SQLAlchemy对象,可能仅在任务结束时使用?这是我提出的唯一可能的解决办法。我想知道是否还有其他问题,或者我的想法是否有其他问题。

只有在必须进行交易时才打开交易。因此,会话应该在实际任务运行时关闭,但对象应该保留在周围并由任务编辑。然后使用
合并
。请确保设置“提交时过期”为
False

是否可以更具体地说明“超时”连接?我曾经用sqlalchemy做过大量芹菜任务,之前已经运行了超过24小时,但还没有出现任何此类问题。不过,我肯定不会让交易持续那么久。您应该在此过程中进行小的提交,否则您可能会在数据库锁定记录和like@StephenFuhry错误是“MySQL服务器已经离开”。连接中断。我相信,这正是问题所在,我让交易进行得太久了。但我觉得我必须这样做,因为我在这段时间内编辑了许多DB对象。芹菜任务使用SQLAlchemy对象。如果我不应该让一个事务长时间开放,我该怎么办?我会从寻找将工作分解成更小的块的方法开始,如果可能的话,这些块不需要这么长的事务。否则,这可能是mysql配置问题。查看max_allowed_数据包或其他类似设置。。绝对不是配置问题。我理解你关于分手的观点。我想答案是只在需要写入时才打开事务。