【问题标题】:how to implement a lockfile-like mechanism between celery workers?如何在芹菜工人之间实现类似锁文件的机制?
【发布时间】:2014-01-25 08:38:11
【问题描述】:

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

(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()

堆栈跟踪:-

   File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 238, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 416, in    __protected_call__
    return self.run(*args, **kwargs)
  File "/home/elasticsearch/celery_test/tasks.py", line 183, in download_data
    auth = get_auth(con)
  File "/home/elasticsearch/celery_test/tasks.py", line 94, in get_auth
    reset_table("auths",con)
  File "/usr/lib/python2.7/dist-packages/MySQLdb/connections.py", line 249, in __exit__
    self.rollback()
ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

【问题讨论】:

    标签: mysql locking celery mysql-python django-celery


    【解决方案1】:

    我不会急于应用锁定机制,而是尝试看看如何修复您的客户端使用数据库的方式,请参阅mysql docs for commands out of sync

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

    如果您决定实施锁定(我也不建议这样做),一个好方法如下:

    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()
    

    详细解释见http://loose-bits.com/2010/10/distributed-task-locking-in-celery.html

    【讨论】:

    • MySQL-python是否默认实现等待功能。很抱歉,但我不明白如何在代码中没有等待函数的情况下让它工作。
    • 很难在没有看到您的查询/SQL 等的情况下判断,最好包含整个堆栈跟踪,而不仅仅是错误本身
    • 我明白了,那么,你知道with 声明的实际作用吗?见stackoverflow.com/questions/8067690/…
    • 很抱歉我还是不明白答案。看来我实际上不需要实现锁定文件机制。我只需要确保对 db 的调用正确,并且正在调用 mysql_free_result。但是,我不确定如何确保这一点。
    • 我的猜测是withcon.commit () 在一起不太好,删除con.commit () 看看情况如何
    猜你喜欢
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2020-08-13
    • 2012-03-22
    • 2014-09-07
    • 2012-05-02
    • 2014-08-17
    • 2022-10-25
    相关资源
    最近更新 更多