python - django rest框架中的异步
问题描述
如何在Django rest框架中实现异步任务?在 python3.7 之后,async.io 成为了 python 语言的一部分,协程也嵌入到了语言中。
但我无法利用它,我不得不使用 celery 和 redis 服务器来实现这种异步行为。
更新
class ReportViewSet(viewsets.ModelViewSet):
queryset = Report.objects.all()
serializer_class = ReportSerializer
filter_class = ReportFilter
def create(self, request):
serializer = ReportSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
report_obj = serializer.save()
#Start multiple tools asynchronously but we need to return the next statement without waiting for those tools to finish
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我试图修改async function
运行工具的创建,但我得到错误,你不能在不是协同例程的执行程序中运行这个函数。当我试图使create
函数异步时,它返回一个协程而不是一个HTTP response
. 因此,django-rest-framework
它本身需要将其内部修改为协程类型。关于如何在不使用任何 MQ 或缓存技术的情况下以一种好的方式做我提到的事情的任何建议或想法。
解决方案
你不应该create
变成一个异步函数。您应该在其中有一个循环create
异步运行所有逻辑,但即使这样也不会在您的异步任务运行时释放工作进程以服务其他请求。您可以在这里做的最好的事情是将任务卸载到 celery,然后通过另一个 API 轮询以检查它们的状态或结果。
Django 是一个同步框架,它不支持您在此处尝试执行的操作。如果您想对重叠请求进行长时间轮询,那么我建议您研究一下龙卷风
推荐阅读
- ssh - ubuntu 19.10 上 git 访问 ssh-add 的无效密钥格式
- azure - 我的 Azure SQL 备份(地理位置)在哪里?
- netlogo - NetLogo 监视器报告器的问题不会显示正确的值
- processing - 椭圆冒泡排序
- javascript - 引用 JS 内部的表单字段不起作用
- python - 终端服务器 Netmiko 连接
- python - 使用 Haswell CPU 的 Python 中的 FLOPS(英特尔酷睿处理器(Haswell,无 TSX))
- c - 数组的单个括号中的嵌套索引
- terraform - 迭代 terraforms 0.12.23 中的 json 对象列表
- python-3.x - 将图像转换为特定尺寸的矩阵?