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,只是改变了并发请求的数量和请求的总数,但是没有变化