首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django REST框架中的并行序列化?或者其他加速模型序列化的方法?

Django REST框架中的并行序列化?或者其他加速模型序列化的方法?
EN

Stack Overflow用户
提问于 2020-02-04 05:50:53
回答 1查看 634关注 0票数 3

我正在开发的应用程序需要通过REST端点向用户提供ORM对象列表。对象列表很大-一次最多可达500或600个(不支持分页)。

模型看起来像这样:

代码语言:javascript
复制
class PositionItem(models.Model):
    account = models.ForeignKey(core_models.Portfolio, on_delete=models.CASCADE)
    macro_category = models.ForeignKey(MacroCategory, on_delete=models.SET_NULL, null=True)
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    sub_category = models.ForeignKey(SubCategory, on_delete=models.SET_NULL, null=True)

我开始使用带有many=True集的标准ModelSerializer,但它非常慢-序列化所有对象需要12秒。通过使用.select_related()方法预取/缓存端点所需的外键,我将运行时间缩短了几秒,并将ModelSerializer替换为自定义序列化函数,该函数只需将字段映射到字典,而无需任何验证开销。然而,它仍然很慢(6-7秒),我想进一步优化。我考虑过尝试将序列化程序并行化,但在实现时遇到了一些问题。

我的自定义序列化程序如下所示:

代码语言:javascript
复制
def serialize_position_record(record):

    account = record.account
    macro_category = record.macro_category
    category = record.category
    sub_category = record.sub_category

    return {
        'account': account.portfolio_id,
        'macro_category': macro_category.macro_category,
        'category': category.category,
        'sub_category': sub_category.sub_category,
        'sorting': {
            'macro_category': macro_category.sort_order,
            'category': category.sort_order,
            'sub_category': sub_category.sort_order

        }
    }

我试过使用Poolmultiprocessing

代码语言:javascript
复制
import multiprocessing
import models
import utils

items = models.Item.objects.select_related().filter(account__user=user)
pool = multiprocessing.Pool(4)
serialized_items = pool.map(utils.serialize_position_record, items)

但它至少会挂起60秒(可能更多,我在它返回任何东西之前就终止了它)。

我还尝试了使用multiprocessing.dummy API进行线程处理:

代码语言:javascript
复制
import multiprocessing
import models
import utils

items = models.Item.objects.select_related().filter(account__user=user)
pool = multiprocessing.dummy.Pool(4)
serialized_items = pool.map(utils.serialize_position_record, items)

但我也有例外:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/Users/xx/venvs/web-portal/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 164, in __get__
    rel_obj = self.field.get_cached_value(instance)
  File "/Users/xx/venvs/web-portal/lib/python3.7/site-packages/django/db/models/fields/mixins.py", line 13, in get_cached_value
    return instance._state.fields_cache[cache_name]
KeyError: 'sub_category'

代码语言:javascript
复制
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/xx/venvs/web-portal/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "reports_subcategory" does not exist
LINE 1: ...", "reports_subcategory"."sort_order" FROM "reports_s...

所以我就不知所措了。我不会写很多并行代码--我写错了什么吗?或者,除了并行化之外,还有更好的方法来优化这个过程吗?我是否达到了性能的天花板?我也在使用django-tenants,因为这是一个多租户应用程序--不确定这是否会导致关系不存在错误。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2020-02-04 05:57:24

考虑使用第三方序列化库,如serpymarshmallow。两者都声称在原生Django Rest框架序列化程序上提供了显着的速度改进。

Serpy在他们的文档上提供了一些detailed benchmarks

如果您已经熟悉Django Rest Framework中的序列化程序,那么这两个库都相当直观。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60047666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档