gpt4 book ai didi

python django 竞争条件与 celery

转载 作者:行者123 更新时间:2023-11-29 00:23:36 25 4
gpt4 key购买 nike

在 python django 项目上工作,这是我想要的:

  1. 用户权限Page1带有对象参数,函数 longFunction()对象的部分被触发并传递给 celery,因此页面可以立即返回

  2. 如果用户尝试访问 Page2使用相同的对象参数,我希望页面挂起直到对象函数 longFunction()Page1 触发终止。

所以我尝试使用 objects.select_for_update() 锁定 mysql 数据库行,但它不起作用。

这是我的代码的简化版本:

def Page1(request, arg_id):
obj = Vm.objects.select_for_update().get(id=arg_id)
obj.longFunction.delay()
return render_to_response(...)

def Page2(request, arg_id):
vm = Vm.objects.select_for_update().get(id=arg_id)
return render_to_response(...)

我想要那个Page2卡在 vm = Vm.objects.select_for_update().get(id=arg_id) 行直到 longFunction()完成了。我是 celery 的新手,看起来当 Page1 返回时,在 Page1 上启动的 mysql 连接丢失了,即使 longFunction()还没完。

还有其他方法可以实现吗?

谢谢

最佳答案

也许这对你有帮助:

from celery.result import AsyncResult
from yourapp.celery import app

def Page1(request, arg_id):
obj = Vm.objects.select_for_update().get(id=arg_id)
celery_task_id = obj.longFunction.delay()
return render_to_response(...)

def Page2(request, arg_id, celery_task_id):
task = AsyncResult(app=app, id=celery_task_id)
state = task.state
while state != "SUCCESFUL":
# wait or do whatever you want
vm = Vm.objects.select_for_update().get(id=arg_id)
return render_to_response(...)

更多信息请访问 http://docs.celeryproject.org/en/latest/reference/celery.states.html

关于python django 竞争条件与 celery ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101977/

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