Python sqlalchemy with_for_更新原因选择在会话中不工作
我正在使用flask+mysql和芹菜+redis 我有一个Python sqlalchemy with_for_更新原因选择在会话中不工作,python,mysql,sqlalchemy,celery,Python,Mysql,Sqlalchemy,Celery,我正在使用flask+mysql和芹菜+redis 我有一个后端和项目模型与外键关系 我在task中运行的类似代码如下所示: @task() def my_task(): while True: backends = db.session.query(Backend).filter(Item.in_use==False) for backend in backends: # do some staff # select Item again a
后端
和项目
模型与外键
关系
我在task中运行的类似代码如下所示:
@task()
def my_task():
while True:
backends = db.session.query(Backend).filter(Item.in_use==False)
for backend in backends:
# do some staff
# select Item again and set it in_use
try:
item = db.session.query(
Item
).with_for_update().filter_by(
backend=backend,
in_use=False
).order_by(func.rand()).first()
if item:
item.in_use = True
backend.usage = Backend.usage+1
db.session.add(item)
db.session.add(backend)
db.session.commit()
except exc.OperationalError as e:
# catching deadlock
pass
db.session.commit()
time.sleep(30)
if item:
item.in_use = False
db.session.add(item)
db.session.commit()
break
如果我并行运行5-10个任务,它工作得很好。但当我最后启动100个任务时,我有10-15个任务将永远有效。因为查询:
backends = db.session.query(Backend).filter(Item.in_use==False)
始终返回0个空闲后端
在MYSQL中,我看到所有项目都已发布。我可以保存它们,更改状态,但任务内的查询会不断返回0项
我启动这样的任务:
@task
def run_tasks():
g = group(my_task.s() for _ in range(0, count))
g()
run_tasks.delay()
如果我愿意:
SHOW PROCESSLIST;
我看到一些睡眠过程
您能解释一下为什么要按(func.rand()
)下单吗?