orn*_*688 3 python redis celery celeryd
我正在使用 Celery 和运行工人的主管,Redis 作为代理,我遇到了一个问题,Celery 工人显然冻结了,使其无法处理更多任务并导致其在 Redis 中的任务队列填满导致一些内存问题的点。我expires
在调用任务时尝试设置该选项,认为这会利用 Redis 对密钥到期的支持:
some_task.apply_async(args=('foo',), expires=60)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,当我在 Redis CLI 中检查相应的列表时,它一直在扩展 - 也许并不奇怪,因为听起来列表过期不是Redis 中的内置功能。将芹菜文档说,到期时间对应的时间后,“出版”的任务,但我找不到什么“出版”,其实就是任何提及。我假设它指的是将任务添加到 Redis 列表中,所以要么这个假设是错误的,要么发生了我不理解的其他事情(或两者兼而有之)。
任务到期时间我错了吗?如果是这样,有没有办法使消息在 Redis 中过期?
上下文比问题更令人费解。您可以使用 redis-cli 并检查了 redis 键。在 redis-cli 中,您可以输入ttl sexykey
并且您应该已经看到剩余的秒数,如果密钥在 Celery 写入时设置为过期,则可以回答您关于此事的特定不确定性。
首先,让我们清楚有一个message broker
. 其次,有一个result backend
。芹菜只有很少message brokers
但很多result backends
。券商的名单是在这里支持后端的.The名单在第10页(如2018-MAR-24)下运输和后端部分在这里。它是result backend
我认为会填满的,因为这也是我所看到的。
Celery 可以使用相同的 Redis 实例作为 amessage broker
和 a result backend
。无论任务是否成功,Celery 都会将执行任务的结果存储为 Redis 密钥,并且此 Redis 密钥的默认到期时间为 1 天(86400 秒)。因此,如果您有很多由 Celery 执行的函数调用,那么您的 Redis 内存缓存将被填满,因为 86400 秒的密钥到期将无法赶上传入的任务结果记录。
要将密钥过期时间缩短为 60 秒,请使用以下 Python 代码段:
app = Celery('justdoit',
broker='redis://172.17.0.2',
backend='redis://172.17.0.2')
app.conf.result_expires = 60
Run Code Online (Sandbox Code Playgroud)
PS:几个小时前我刚刚在学习 Celery,我立即意识到(在它发生之前)与所描述的完全相同的 Redis 填充场景。我已经使用Redis一年了,所以我知道它的一些特点。
归档时间: |
|
查看次数: |
5752 次 |
最近记录: |