无法在 celery/arq 任务中使用 ODM beanie API

问题描述 投票:0回答:2

当任务代码中有对beanie文档的操作时,会抛出

beanie.exceptions.CollectionWasNotInitialized
错误。 如果将相同的函数作为普通函数而不是任务调用,那么一切都会正常工作。

在这种情况下,无檐小便帽中可能需要通过一些会话。你能告诉我该怎么做吗?

python mongodb celery arq
2个回答
0
投票

我在 Stack Overflow 中发现了其他对话,我认为它可以帮助管理在 Celery 任务中使用Beanie。

如何将Celery与asyncio结合起来?,特别是以下评论:

https://stackoverflow.com/a/57286909/1995585

我使用建议的解决方案进行了快速测试,并设法在 Celery 任务中运行 Beanie 文档中的示例代码...但在 Celery 正确支持 asyncio 之前,这肯定是一种解决方法。


0
投票

Celery 不支持 asyncio,因此不支持 Beanie。

Beanie 有一个名为 Bunnet 的非异步版本,其中一切本质上都是相同的,您所要做的就是删除异步并等待。


虽然我应该做什么,但我也遇到了同样的问题,因为我不想牺牲 FastAPI 的 async/await,它本质上包含了我的整个代码库。


我的管理方式:

Propan - 一个极其简化的 aio-pika 包装器,主要为 FastAPI 构建,具有简单的集成,我将它与 RabbitMQ 一起使用。它还使用 Pydantic 来序列化消息。我基本上不需要改变任何事情来完成完整的发布/订阅消息传递。

坚韧 - 我也一直在利用坚韧进行重试。使用装饰器使重试变得更容易,例如 celery。

TaskIQ - 他们从 celery 中获得了很多灵感,但是使用了 asyncio。我认为这不是一对一的,也没有用于结果后端的 RabbitMQ。但是,如果您使用 Redis 进行消息传递和结果处理,它可以为您提供 celery 所需要的多处理功能,而无需牺牲 asyncio。

Patio - Patio 很新,但看起来非常有前途。我认为他们正在与 aio-pika 合作。但他们没有文档。我不确定是否是因为它还不稳定/生产,或者这就是他们的 README.md 上的全部内容。

© www.soinside.com 2019 - 2024. All rights reserved.