python-3.6 - 如何在 django2.0 中进行几个异步方法调用

标签 python-3.6 python-asyncio aiohttp django-2.0

我正在做一个小项目,决定使用Django2.0和python3.6+。

在我的 django View 中,我想调用一堆 REST API 并获取它们的结果(以任何顺序),然​​后处理我的请求(将某些内容保存到数据库)。

我知道正确的方法是使用aiohttp并定义一个async方法并等待它。

我对 get_event_loop() 以及 View 方法本身是否应该是异步方法(如果它必须等待来自这些方法的响应)感到困惑。

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 是一个同步框架。

关于python-3.6 - 如何在 django2.0 中进行几个异步方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49180910/

相关文章:

python - 从未检索到 future 的异常

python - 为 Enum 的子类重载 __init__()

python - 如何避免在 Python 中的构造函数之间传递属性?

excel - Pandas 0.22.0 : IndexError: list index out of range when reading xls

python-3.6 - 如何使用 apscheduler 在特定时间之间每分钟触发一次作业?

python - Asyncio 不异步执行任务

python - asyncio 运行多个任务,同时保留顺序并处理错误

python - AWS Fargate 任务 - awslogs 驱动程序 - 间歇性日志

python-3.x - python3 aiohttp服务器在nginx后面获取不到真实ip

python - 在aiohttp 2中指定日志请求格式