为什么从Django异步调用数据库时,我看不到任何性能提高?

时间:2019-05-19 10:50:48

标签: django asynchronous

Django本身是同步的,但是我最近开始了一个新的Django项目,并决定从头开始将其设置为异步,这意味着我遵循了大多数django-channels设计,并且通道拥有异步http-consumers和协议路由器,而不是使用daphne,我与uvloop工作者一起运行了gunicorn。

显而易见的一件事是,使用ORM查询数据库不是异步的。在线上没有有关如何解决此问题的信息,所以我想为什么不使用外部异步postgres客户端软件包(aiopg),然后将ORM生成的SQL查询传递给aiopg,然后仅将结果返回到django模型实例。它可以正常工作,但是在使用异步aiopg之前和之后使用apache bench,我发现每秒的请求绝对没有增加。

以下代码显示了我的操作方式。

import aiopg

dsn = 'dbname=db user=root password=password123 host=postgres-container port=5432'
pool = aiopg.create_pool(dsn)


async def async_query(q):
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute(q)
            ret = []
            async for row in cur:
                ret.append(row)
            return ret

async def list(self, body):
    query = Model.objects.all().order_by("title")
    ares = await async_query(str(query.query))
    results = [Model(**{
            "id": i[0],
            "title": i[1],
            "created": i[2].replace(tzinfo=None),
            "updated": i[3].replace(tzinfo=None)
        }) for i in ares]
    return {
        "data": ModelSerializer(results, many=True).data
    }

然后使用apache Bench,只是改变了并发请求的数量和请求的总数,但是没有变化

0 个答案:

没有答案