django - 从在事件循环中运行的异步函数中调用 Django ORM 查询
问题描述
[设置]我使用 Django 3.0 作为wsgi
应用程序。
我需要从视图中运行协程(如下所示)。这在事件循环中运行asyncio
。从这个事件循环/协程中,我需要使用 Django 的 ORM 获取数据库中的一些对象,但是 django 抛出以下异常:
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async
import asyncio
import concurrent
def get_users_from_db():
return User.objects.all()
async def do_some_async_stuff():
executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
loop = asyncio.get_event_loop()
attachments = await loop.run_in_executor(executor, get_users_from_db)
def view(request):
task = LOOP.create_task(do_some_async_stuff)
result = not LOOP.is_running() and LOOP.run_until_complete(task)
我不确定我做错了什么。据我了解Django 的文档建议我应该能够在单独的线程中运行同步任务(如 ORM 查询),但这仍然不起作用。
有趣的是,使用本地运行代码可以manage.py runserver
正常工作,但是使用 `gunicorn --bind 127.0.0.1:8000 src.config.wsgi:application 运行它会引发上述异常。
解决方案
推荐阅读
- bash - Bash 脚本返回给定扩展名的所有元素,而不使用打印标志
- c++ - 查找“33614080”的 mfc 大型机 OnCommand 消息
- java - ArrayList 重复输入?
- windows - 手动链接到 LLVM 中的 Windows 库
- python - 给定两个具有分组项目的数据框和另一个具有等效组的数据框,我可以创建一个包含来自匹配组的所有单元对的数据框吗?
- julia - 为什么 Julia 中的循环会引入自己的作用域
- apache-kafka - kafka 主题中推荐的消息长度
- ruby-on-rails - “安装 puma (3.4.0) 时出错”
- google-analytics - Google Analytics(分析)在特定页面之后访问的平均页面数
- react-native - 滚动隐藏标题在本机反应中不能按需要工作