查询Django ORM inside celery任务:仅同步操作:不能从异步上下文调用此函数-使用线程或sync_to_async

thigvfpy  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(120)

我们在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

gopyfrb3

gopyfrb31#

sync_to_async()将返回一个协程。正如TypeError所暗示的,您不能直接迭代协程。您必须await它,如示例所示。
从文档:

from asgiref.sync import sync_to_async

results = await sync_to_async(Blog.objects.get, thread_sensitive=True)(pk=123)

在你的图片中,你不await调用。

相关问题