首页 > 解决方案 > 频繁出现 KeyErrors 的可能原因是什么?

问题描述

我在运行 Celery 时遇到 KeyErrors(使用 v4.1.0 - 潜在调用和 v4.4.7 - 悬崖),使用 RabbitMQ v3.6.6 作为传输,使用 memcached v1.4.33 作为后端。我们在 Debian 9 上运行 Python 2.7.13,因此,由于 Python 版本,Celery v4.4.7 已经达到了我们所能达到的最高水平。

有时,在我们开始看到 KeyErrors 之前,Celery 处理可以正常运行半小时左右。当它们开始时,它们是间歇性的,并且其他 Celery 任务成功完成。有时,当我们开始处理时,KeyErrors 就开始了。

这发生在让 memcached 条目在 24 小时后过期(默认值)和将过期时间设置为 60 秒(我们设置它以检查 memcached 内存使用情况,以防它使用太多内存并清除我们仍然需要的键) . 在任何情况下,即使是 60 秒的到期时间也无法解释丢失的密钥,因为我们的工作人员所需的处理总是在几秒钟内完成。

键始终是 GUID,例如 KeyError: '40e9373c-5921-48c7-a5e5-94bf0c767682' 或 KeyError: 'd89cc3a6-f7eea-41ec-bdc8-7023b3a5dbda'。

我们应该在哪里寻找这些错误的原因?这可能是 Celery 处理其密钥或存储的错误吗?

这是错误堆栈:

Traceback (most recent call last):
  File "myApp/parser.py", line 216, in parse
    resultSet = groupResultSet.get(timeout = timeoutInSeconds)
  File "/root/.virtualenvs/scraping/lib/python2.7/site-packages/celery/result.py", line 635, in get
    on_message=on_message,
  File "/root/.virtualenvs/scraping/lib/python2.7/site-packages/celery/result.py", line 753, in join_native
    acc[order_index[task_id]] = value
KeyError: '40e9373c-5921-48c7-a5e5-94bf0c767682'

这是我调用 Celery 的 get() 的代码:

logger.info("!!! About to form chunks")
groupResultSet = targetGroup.chunks([(target, targetData, numberOfNetworkErrors) for target in targets], 1).apply_async(queue=selectedQueue['name'])
logger.info("!!! Finished forming chunks")

timeoutInSeconds = 1800
logger.info("****** Before get() for {} ******".format(targetSubdomain))
resultSet = groupResultSet.get(timeout = timeoutInSeconds)
logger.info("****** Got resultSet for {} ******".format(targetSubdomain))

标签: pythonpython-2.7celerymemcached

解决方案


推荐阅读