Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sqlalchemy with_for_更新原因选择在会话中不工作_Python_Mysql_Sqlalchemy_Celery - Fatal编程技术网

Python sqlalchemy with_for_更新原因选择在会话中不工作

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

我正在使用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 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()
)下单吗?