在长 运行 Celery 任务中使用 SQLAlchemy 对象
Using SQLAlchemy objects in a long running Celery task
我有一个很长的 运行 任务来更新一些 SQLAlchemy 对象。在任务开始时打开一个会话,在此过程中进行更新,最后提交事务。问题是任务运行的时间很长,所以在提交甚至能够发生之前,连接将关闭(超时,"gone away",无论你想怎么称呼它)。这将导致提交失败并导致整个任务失败。
这似乎绝对是向数据库写入短任务或与 Celery 无关的事情的正确方法。但是如果任务时间太长肯定是个问题。
还有其他推荐的模式吗? Celery 任务是否应该甚至不使用 SQLAlchemy 对象,而是使用某种静态 class ,其数据可用于更新实际的 SQLAlchemy 对象,也许只有在任务结束时?这是我想出的唯一可能的解决方案。我想知道是否还有其他人或者我的想法是否有其他问题。
仅在必须发生时才打开事务。因此,会话应在实际任务 运行 时关闭,但对象应保留并由任务编辑。然后使用merge
。确保设置 expire_on_commit
为 False
.
我有一个很长的 运行 任务来更新一些 SQLAlchemy 对象。在任务开始时打开一个会话,在此过程中进行更新,最后提交事务。问题是任务运行的时间很长,所以在提交甚至能够发生之前,连接将关闭(超时,"gone away",无论你想怎么称呼它)。这将导致提交失败并导致整个任务失败。
这似乎绝对是向数据库写入短任务或与 Celery 无关的事情的正确方法。但是如果任务时间太长肯定是个问题。
还有其他推荐的模式吗? Celery 任务是否应该甚至不使用 SQLAlchemy 对象,而是使用某种静态 class ,其数据可用于更新实际的 SQLAlchemy 对象,也许只有在任务结束时?这是我想出的唯一可能的解决方案。我想知道是否还有其他人或者我的想法是否有其他问题。
仅在必须发生时才打开事务。因此,会话应在实际任务 运行 时关闭,但对象应保留并由任务编辑。然后使用merge
。确保设置 expire_on_commit
为 False
.