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 也能正常工作。既然是生产环境,我想安全处理。
我在日志中注意到了同样的情况,对我来说,原因是 redis 超时时间比任务花费的时间短,因此它尝试在过期后释放锁,例如:
with redis_client.lock('some_key', timeout=5):
time.sleep(10)
Run Code Online (Sandbox Code Playgroud)
这使
redis.exceptions.LockError:无法释放不再拥有的锁