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

dae*_*n24 2 django redis celery django-celery

有时重新启动 celerybeat 后,我​​会收到以下错误,我已将 celerybeat 设置为 redis 的服务,

sude service celerybeat restart
Run Code Online (Sandbox Code Playgroud)

下面是异常跟踪

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
Run Code Online (Sandbox Code Playgroud)

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

lpe*_*lis 5

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

with redis_client.lock('some_key', timeout=5):
    time.sleep(10)
Run Code Online (Sandbox Code Playgroud)

这使

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