如何在 django2.0 中进行几个异步方法调用
How to make a couple of async method calls in django2.0
我正在做一个小项目,决定使用 Django2.0 和 python3.6+.
在我的 django 视图中,我想调用一堆 REST API 并获取它们的结果(以任何顺序),然后处理我的请求(将某些内容保存到数据库)。
我知道正确的做法是使用 aiohttp
并定义一个 async
方法并等待它。
我对 get_event_loop()
感到困惑,如果视图方法必须 await
来自这些方法的响应,它本身是否应该是异步方法。
Django2.0 本身(在 python3.6+ 中实现)是否也有一个我可以添加到其中的循环?
这是我想象中的景色
from rest_framework import generics
from aiohttp import ClientSession
class CreateView(generics.ListCreateAPIView):
def perform_create(self, serializer):
await get_rest_response([url1, url2])
async def fetch(url):
async with session.get(url) as response:
return await response.read()
async def get_rest_response(urls):
async with ClientSession() as session:
for i in range(urls):
task = asyncio.ensure_future(fetch(url.format(i), session))
tasks.append(task)
responses = await asyncio.gather(*tasks)
从技术上讲,您可以通过 loop.run_until_complete() 调用:
class CreateView(generics.ListCreateAPIView):
def perform_create(self, serializer):
loop = asyncio.get_event_loop()
loop.run_until_complete(get_rest_response([url1, url2]))
但我怀疑这种方法是否会显着加快您的代码速度。
无论如何,Django 是一个同步框架。
我正在做一个小项目,决定使用 Django2.0 和 python3.6+.
在我的 django 视图中,我想调用一堆 REST API 并获取它们的结果(以任何顺序),然后处理我的请求(将某些内容保存到数据库)。
我知道正确的做法是使用 aiohttp
并定义一个 async
方法并等待它。
我对 get_event_loop()
感到困惑,如果视图方法必须 await
来自这些方法的响应,它本身是否应该是异步方法。
Django2.0 本身(在 python3.6+ 中实现)是否也有一个我可以添加到其中的循环?
这是我想象中的景色
from rest_framework import generics
from aiohttp import ClientSession
class CreateView(generics.ListCreateAPIView):
def perform_create(self, serializer):
await get_rest_response([url1, url2])
async def fetch(url):
async with session.get(url) as response:
return await response.read()
async def get_rest_response(urls):
async with ClientSession() as session:
for i in range(urls):
task = asyncio.ensure_future(fetch(url.format(i), session))
tasks.append(task)
responses = await asyncio.gather(*tasks)
从技术上讲,您可以通过 loop.run_until_complete() 调用:
class CreateView(generics.ListCreateAPIView):
def perform_create(self, serializer):
loop = asyncio.get_event_loop()
loop.run_until_complete(get_rest_response([url1, url2]))
但我怀疑这种方法是否会显着加快您的代码速度。 无论如何,Django 是一个同步框架。