Mysql 如何在芹菜工人之间实现类似锁文件的机制?

Mysql 如何在芹菜工人之间实现类似锁文件的机制?,mysql,locking,celery,mysql-python,django-celery,Mysql,Locking,Celery,Mysql Python,Django Celery,我有一个分布式计算框架,它使用芹菜+RABBITMQ+supervisor。我的工作人员的任务包括从数据库中读取数据、计算一些值以及在完成该过程后更新数据库。但是,当我尝试以分布式方式运行多个Worker时,我会不断遇到错误:- (2014,“命令不同步;您现在无法运行此命令”) 有人能给我建议一种方法来设置一个互斥或类似锁文件的机制,这样工作人员就可以同时访问数据库了 任何帮助都将不胜感激, 谢谢 阿米特 编辑:- con = mdb.connect(parameters...) def r

我有一个分布式计算框架,它使用芹菜+RABBITMQ+supervisor。我的工作人员的任务包括从数据库中读取数据、计算一些值以及在完成该过程后更新数据库。但是,当我尝试以分布式方式运行多个Worker时,我会不断遇到错误:-

(2014,“命令不同步;您现在无法运行此命令”)

有人能给我建议一种方法来设置一个互斥或类似锁文件的机制,这样工作人员就可以同时访问数据库了

任何帮助都将不胜感激, 谢谢 阿米特

编辑:-

con = mdb.connect(parameters...)

def reset_table(table_name,con):
    with con:
        cur = con.cursor(mdb.cursors.DictCursor)
        cur.execute("UPDATE " + table_name + " SET active_status = 0 where last_access <     (NOW() - INTERVAL 15 MINUTE)")
        con.commit()

我不会急于应用锁定机制,而是尝试了解如何修复客户端使用数据库的方式,请参阅

如果命令不同步;您现在不能在客户端代码中运行此命令,您正在以错误的顺序调用客户端函数

如果您决定实现锁定(我也不推荐这样做),一种很好的方法如下:

import redis

have_lock = False
my_lock = redis.Redis().lock("my_key")
try:
    have_lock = my_lock.acquire(blocking=True)
    if have_lock:
        print("Got lock.")
    else:
        print("Did not acquire lock.")

finally:
    if have_lock:
        my_lock.release()

有关详细说明,请参见

MySQL python是否默认实现等待函数。很抱歉,但我不明白如何在代码中没有等待函数的情况下使其工作。如果没有查询/SQL等,很难判断。此外,最好包括整个堆栈跟踪,而不仅仅是我自己看到的错误,因此,您知道
with
语句的实际作用是什么吗?很抱歉,我还是不明白答案。看起来我实际上不需要实现锁文件机制。我只需要确保对db的调用是正确的,并且调用了mysql_free_结果。但是,我不知道如何确保这一点。我猜
con.commit()
的关系不太好,请删除
con.commit()
,然后看看情况如何
import redis

have_lock = False
my_lock = redis.Redis().lock("my_key")
try:
    have_lock = my_lock.acquire(blocking=True)
    if have_lock:
        print("Got lock.")
    else:
        print("Did not acquire lock.")

finally:
    if have_lock:
        my_lock.release()