Django 实现协程

219 阅读1分钟

Django 实现协程

Djano实现协程示例

需要在视图类中调用event_loop, 并将异步函数传入event_loop。

import asyncio
import datetime
import time
from rest_framework.views import APIView

class AsyncioView(APIView):
    def get(self, request, *args, **kwargs):
        # 创建事件循环对象
        loop = asyncio.new_event_loop()
        # 将当前线程的事件循环设置为loop循环对象
        asyncio.set_event_loop(loop)
        self.loop = loop
        try:
            result = self.loop.run_until_complete(
                self.gather_tasks(*args,**kwargs))
        finally:
            self.loop.close()
        return JsonResponse({'result': result})


    async def gather_tasks(self,*args,**kwargs):
        tasks = []
        for i in range(5):
            fut = self.make_future(self.io_task,{'param':i})
            tasks.append(fut)
        results = await asyncio.gather(*tasks)
        return results

    async def make_future(self,func,*args,**kwargs):
        future = self.loop.run_in_executor(None,func,*args,**kwargs)
        response = await future
        return response
    
    def io_task(self,param):
        time.sleep(3)
        print(f'task {param} finished!')
        return f'task {param} finished at {datetime.datetime.now()}'

返回结果:

{
    "result": [
        "task {'param': 0} finished at 2023-12-01 15:22:26.015853",
        "task {'param': 1} finished at 2023-12-01 15:22:26.014860",
        "task {'param': 2} finished at 2023-12-01 15:22:26.014860",
        "task {'param': 3} finished at 2023-12-01 15:22:26.015853",
        "task {'param': 4} finished at 2023-12-01 15:22:26.015853"
    ]
}