redis.exceptions.LockError:重启celerybeat后无法释放解锁的锁

时间:2018-09-11 18:38:30

标签: django redis celery django-celery

有时重新启动celerybeat后,出现以下错误,我已将celerybeat设置为具有Redis的服务,

sude service celerybeat restart

下面是异常跟踪

Traceback (most recent call last):
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 484, in start
    time.sleep(interval)
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/apps/beat.py", line 148, in _sync
    beat.sync()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 493, in sync
    self.scheduler.close()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redbeat/schedulers.py", line 272, in close
    self.lock.release()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 135, in release
    self.do_release(expected_token)
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 264, in do_release
    raise LockError("Cannot release a lock that's no longer owned")
redis.exceptions.LockError: Cannot release a lock that's no longer owned

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/apps/beat.py", line 112, in start_scheduler
    beat.start()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 490, in start
    self.sync()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/celery/beat.py", line 493, in sync
    self.scheduler.close()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redbeat/schedulers.py", line 272, in close
    self.lock.release()
  File "/home/ec2-user/pyenv/local/lib/python3.4/site-packages/redis/lock.py", line 133, in release
    raise LockError("Cannot release an unlocked lock")
redis.exceptions.LockError: Cannot release an unlocked lock

并非每次都发生该异常,而且我也没有注意到由此引起的任何问题,即使发生此异常,celerybeat也可以正常工作。既然是生产环境,我想安全地处理它。

1 个答案:

答案 0 :(得分:0)

我在日志中注意到了相同的情况,因为我的原因是redis超时时间短于任务执行的时间,因此它尝试在过期后释放锁,例如:

with redis_client.lock('some_key', timeout=5):
    time.sleep(10)

给出

  

redis.exceptions.LockError:无法释放不再有效的锁   拥有