django - redis.异常.LockError : Cannot release an unlocked lock after restarting celerybeat

标签 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 也能正常工作。既然是生产环境,我想安全处理。

最佳答案

我在日志中注意到了同样的情况,对我来说,原因是 redis 超时时间比任务花费的时间短,因此它尝试在过期后释放锁,例如:

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

这给出了

redis.exceptions.LockError: Cannot release a lock that's no longer owned

关于django - redis.异常.LockError : Cannot release an unlocked lock after restarting celerybeat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52282271/

相关文章:

python - Django "Did you mean?"查询

python - 从父目录构建 Dockerfile

python - Airflow 随机向任务发送sigterms

python - Django - gettext_lazy 不适用于字符串插值/连接(列表内)

python - 使用相关对象管理器的创建方法时,django 如何分配外键?

python - 如何解密最初使用 Fernet 加密的不同服务上的值?

redis - Redis 批量插入(使用客户端的 --pipe)有这么大的限制吗?

php - Redis数据类型和创建购物车的命令

ruby - 如何将此 Ruby 代码转换为 Redis 命令行?

python - 对 Django 应用程序的 celery 和 redis 进行故障排除