我们在Django旁边使用celery任务,在不同的celery任务中,有几个场合celery任务通过Django的ORM阅读数据库。
每隔一段时间,当在celery任务中使用ORM时,任务会抛出:
SynchronousOnlyOperation:您不能从异步上下文调用它-使用线程或sync_to_async。
我觉得奇怪的是,它有时会发生,而不是每次查询是通过ORM?其次,当试图根据Django文档中的建议解决它时:
https://docs.djangoproject.com/en/3.2/topics/async/
像这样:Example of sync_to_asynch ussage
我遇到了另一个问题:类型错误:'coroutine'对象不可迭代
我的问题是:
1.为什么这个问题只是偶尔发生,而不是每次我在celery任务中使用ORM进行查询时?
1.有办法解决吗?
环境
celery任务使用gevent运行,如下所示:celery -A Tasks worker -P gevent -c 10 -l INFO -E
Python 3.8
简体中文
Celery 5.1.0
1条答案
按热度按时间gopyfrb31#
sync_to_async()
将返回一个协程。正如TypeError所暗示的,您不能直接迭代协程。您必须await
它,如示例所示。从文档:
在你的图片中,你不
await
调用。